Compare commits
15 changed files with 1090 additions and 1072 deletions
16
.gitignore
vendored
Normal file
16
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Composer dependencies (regenerated with composer install)
|
||||
/vendor/
|
||||
|
||||
# PHPUnit cache
|
||||
.phpunit.result.cache
|
||||
|
||||
# Stray gettext output written by `msgfmt` (without -o) to the CWD.
|
||||
/messages.mo
|
||||
|
||||
# Claude Code config and code graph
|
||||
/.claude/
|
||||
/.codegraph/
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
|
@ -1,60 +1,5 @@
|
|||
== Changelog ==
|
||||
|
||||
= 1.2.3 =
|
||||
|
||||
_Release date: 2026-08-24_
|
||||
|
||||
**Changed**
|
||||
|
||||
* Manager (by ROBOTSTXT) detection now checks the ecosystem presence constant `ROBOTSTXT_MANAGER_NOTICED` (defined by Manager 1.6.2+) instead of scanning the installed plugin list on every call. On sites running older Manager versions the detection falls back to the previous plugin-list scan.
|
||||
|
||||
**Compatibility**
|
||||
|
||||
* WordPress: 7.0 - 7.1
|
||||
* PHP: 5.6 - 8.5
|
||||
* WP-CLI: 2.12 or newer
|
||||
|
||||
**Tests**
|
||||
|
||||
* PHP Coding Standards: WordPress-Core, WordPress-Docs, WordPress-Extra
|
||||
* PHPCompatibility: 5.6 - 8.5
|
||||
* PHPStan: level 9 (incl. wp-compat @ Requires at least 7.0)
|
||||
* PHPUnit: all tests passing (single-site), including both Manager-detection paths (constant defined / not defined)
|
||||
|
||||
= 1.2.2 =
|
||||
|
||||
_Release date: 2026-08-17_
|
||||
|
||||
**Highlights**
|
||||
|
||||
* Manager (by ROBOTSTXT) detection: a dismissible notice on the Plugins list screens and a persistent warning on the plugin settings pages recommend installing Manager when it is not active, since plugin updates are delivered through it.
|
||||
* Removed the bundled JSON updater; updates are now handled by Manager (by ROBOTSTXT).
|
||||
|
||||
**Added**
|
||||
|
||||
* Dismissible admin notice on the site and network Plugins list screens recommending Manager (by ROBOTSTXT) (`https://www.robotstxt.software/plugins/robotstxt-manager/`) when it is not installed and active.
|
||||
* Persistent (non-dismissible) warning with the same recommendation on the site and network settings pages of the plugin when Manager is not active.
|
||||
|
||||
**Changed**
|
||||
|
||||
* Removed the bundled `class-robotstxt-updater.php` library and the `update.json` file. Plugin updates are now delivered through Manager (by ROBOTSTXT).
|
||||
* Plugin URI and new Update URI header now point to `https://www.robotstxt.software/plugins/robotstxt-ai-translator/`; Author URI now points to `https://www.robotstxt.software/`.
|
||||
* Minimum PHP version lowered from 7.4 to 5.6, matching the real compatibility floor verified with a PHPCompatibility 5.6-8.5 scan. Minimum WordPress version remains 7.0 (the plugin uses the native WordPress AI client).
|
||||
* Updated the Spanish (es_ES) and Catalan (ca) translations, including the new Manager notice strings.
|
||||
|
||||
**Compatibility**
|
||||
|
||||
* WordPress: 7.0 - 7.1
|
||||
* PHP: 5.6 - 8.5
|
||||
* WP-CLI: 2.12 or newer
|
||||
|
||||
**Tests**
|
||||
|
||||
* PHP Coding Standards: WordPress-Core, WordPress-Docs, WordPress-Extra
|
||||
* PHPCompatibility: 5.6 - 8.5
|
||||
* PHPStan: level 9 (incl. wp-compat @ Requires at least 7.0)
|
||||
* PHPUnit: 57/57 tests passing (single-site)
|
||||
|
||||
= 1.2.1 =
|
||||
|
||||
_Release date: 2026-08-07_
|
||||
|
|
|
|||
476
class-robotstxt-updater.php
Normal file
476
class-robotstxt-updater.php
Normal file
|
|
@ -0,0 +1,476 @@
|
|||
<?php
|
||||
/**
|
||||
* Generic JSON-based updater for ROBOTSTXT plugins.
|
||||
*
|
||||
* Copy this file into any ROBOTSTXT plugin. It auto-configures itself by
|
||||
* reading the plugin headers and looking for a `Gitea Plugin URI` header to
|
||||
* construct the remote update.json URL.
|
||||
*
|
||||
* Usage in the main plugin file:
|
||||
* require_once AI_TRANSLATOR_DIR . 'class-robotstxt-updater.php';
|
||||
* Robotstxt_Updater::init( AI_TRANSLATOR_FILE );
|
||||
*
|
||||
* @package ROBOTSTXT
|
||||
* @since 1.0.0
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'Robotstxt_Updater' ) ) {
|
||||
|
||||
/**
|
||||
* Generic updater that works with any ROBOTSTXT plugin.
|
||||
*
|
||||
* Reads the plugin headers to construct the remote update.json URL and
|
||||
* hooks into WordPress's standard update mechanism.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
class Robotstxt_Updater {
|
||||
|
||||
/**
|
||||
* Absolute path to the main plugin file.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @var string
|
||||
*/
|
||||
private $plugin_file_path;
|
||||
|
||||
/**
|
||||
* Plugin basename (e.g. 'my-plugin/my-plugin.php').
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @var string
|
||||
*/
|
||||
private $plugin_basename;
|
||||
|
||||
/**
|
||||
* Plugin slug (directory name).
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @var string
|
||||
*/
|
||||
private $plugin_slug;
|
||||
|
||||
/**
|
||||
* URL of the remote update.json file.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @var string
|
||||
*/
|
||||
private $json_url;
|
||||
|
||||
/**
|
||||
* Transient cache key for this plugin's remote data.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @var string
|
||||
*/
|
||||
private $cache_key;
|
||||
|
||||
/**
|
||||
* Parsed plugin file headers.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @var array<string,bool|string>
|
||||
*/
|
||||
private $plugin_data;
|
||||
|
||||
/**
|
||||
* Creates the updater instance and registers WordPress hooks.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @param string $plugin_file_path Absolute path to the main plugin file.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function init( $plugin_file_path ) {
|
||||
$instance = new self( (string) $plugin_file_path );
|
||||
$instance->register();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor — populates instance state from the plugin file headers.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @param string $plugin_file_path Absolute path to the main plugin file.
|
||||
*/
|
||||
private function __construct( $plugin_file_path ) {
|
||||
$this->plugin_file_path = (string) $plugin_file_path;
|
||||
$this->plugin_basename = plugin_basename( $this->plugin_file_path );
|
||||
$this->plugin_slug = dirname( $this->plugin_basename );
|
||||
$this->plugin_data = $this->get_plugin_data();
|
||||
$this->json_url = $this->build_json_url();
|
||||
$this->cache_key = 'robotstxt_updater_' . md5( $this->plugin_basename );
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the WordPress hooks needed for update checking.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function register() {
|
||||
add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'inject_update_info' ) );
|
||||
add_filter( 'plugins_api', array( $this, 'provide_plugin_details' ), 10, 3 );
|
||||
add_action( 'admin_init', array( $this, 'handle_cache_clear' ) );
|
||||
add_action( 'robotstxt_updater_clear_cache', array( $this, 'clear_cache' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the plugin headers, loading the admin helper file if needed.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @return array<string,bool|string>
|
||||
*/
|
||||
private function get_plugin_data() {
|
||||
if ( ! function_exists( 'get_plugin_data' ) ) {
|
||||
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
||||
}
|
||||
|
||||
$data = get_plugin_data( $this->plugin_file_path, false, false );
|
||||
|
||||
return is_array( $data ) ? $data : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the remote update.json URL from the plugin headers.
|
||||
*
|
||||
* Uses the `Gitea Plugin URI` header when present. Falls back to the
|
||||
* `Plugin URI` header for legacy configurations. If neither yields a
|
||||
* usable URL, constructs one from the plugin slug.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @return string Fully-qualified URL.
|
||||
*/
|
||||
private function build_json_url() {
|
||||
$gitea_uri = isset( $this->plugin_data['Gitea Plugin URI'] )
|
||||
? (string) $this->plugin_data['Gitea Plugin URI']
|
||||
: '';
|
||||
|
||||
if ( '' !== $gitea_uri ) {
|
||||
// Full URL already provided.
|
||||
if ( 0 === strpos( $gitea_uri, 'http' ) ) {
|
||||
return rtrim( $gitea_uri, '/' ) . '/raw/branch/main/update.json';
|
||||
}
|
||||
|
||||
// "OWNER/REPO" short-form.
|
||||
if ( (bool) preg_match( '#^[^/]+/[^/]+$#', $gitea_uri ) ) {
|
||||
return 'https://git.robotstxt.es/' . $gitea_uri . '/raw/branch/main/update.json';
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: Plugin URI on the Gitea server.
|
||||
$plugin_uri = isset( $this->plugin_data['PluginURI'] )
|
||||
? (string) $this->plugin_data['PluginURI']
|
||||
: '';
|
||||
|
||||
if ( '' !== $plugin_uri && false !== strpos( $plugin_uri, 'git.robotstxt.es' ) ) {
|
||||
return rtrim( $plugin_uri, '/' ) . '/raw/branch/main/update.json';
|
||||
}
|
||||
|
||||
// Last resort: derive from the plugin slug.
|
||||
return 'https://git.robotstxt.es/ROBOTSTXT/' . $this->plugin_slug . '/raw/branch/main/update.json';
|
||||
}
|
||||
|
||||
/**
|
||||
* Injects update information into WordPress's plugin update transient.
|
||||
*
|
||||
* Hooked to `pre_set_site_transient_update_plugins`.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @param mixed $transient The update_plugins transient value.
|
||||
*
|
||||
* @return mixed The (possibly modified) transient.
|
||||
*/
|
||||
public function inject_update_info( $transient ) {
|
||||
if ( ! is_object( $transient ) ) {
|
||||
return $transient;
|
||||
}
|
||||
|
||||
/**
|
||||
* Type narrowed to stdClass after is_object() check above.
|
||||
*
|
||||
* @var stdClass $transient
|
||||
*/
|
||||
|
||||
if ( empty( $transient->checked ) || ! is_array( $transient->checked ) ) {
|
||||
return $transient;
|
||||
}
|
||||
|
||||
if ( empty( $transient->checked[ $this->plugin_basename ] ) ) {
|
||||
return $transient;
|
||||
}
|
||||
|
||||
$checked_value = $transient->checked[ $this->plugin_basename ];
|
||||
$current_version = is_scalar( $checked_value ) ? (string) $checked_value : '';
|
||||
$remote = $this->get_remote_data();
|
||||
|
||||
if ( ! isset( $remote['version'], $remote['download_url'] ) ) {
|
||||
return $transient;
|
||||
}
|
||||
|
||||
if ( ! is_string( $remote['version'] ) || ! is_string( $remote['download_url'] ) ) {
|
||||
return $transient;
|
||||
}
|
||||
|
||||
if ( '' === $remote['download_url'] ) {
|
||||
return $transient;
|
||||
}
|
||||
|
||||
if ( ! $this->is_compatible( $remote ) ) {
|
||||
return $transient;
|
||||
}
|
||||
|
||||
if ( version_compare( $remote['version'], $current_version, '>' ) ) {
|
||||
$slug = isset( $remote['slug'] ) && is_string( $remote['slug'] ) ? $remote['slug'] : $this->plugin_slug;
|
||||
$homepage = isset( $remote['homepage'] ) && is_string( $remote['homepage'] ) ? $remote['homepage'] : '';
|
||||
|
||||
if ( '' === $homepage && isset( $this->plugin_data['PluginURI'] ) ) {
|
||||
$homepage = (string) $this->plugin_data['PluginURI'];
|
||||
}
|
||||
|
||||
$update = (object) array(
|
||||
'slug' => $slug,
|
||||
'plugin' => $this->plugin_basename,
|
||||
'new_version' => $remote['version'],
|
||||
'url' => $homepage,
|
||||
'package' => $remote['download_url'],
|
||||
'tested' => isset( $remote['tested'] ) && is_string( $remote['tested'] ) ? $remote['tested'] : '',
|
||||
'requires' => isset( $remote['requires'] ) && is_string( $remote['requires'] ) ? $remote['requires'] : '',
|
||||
'requires_php' => isset( $remote['requires_php'] ) && is_string( $remote['requires_php'] ) ? $remote['requires_php'] : '',
|
||||
);
|
||||
|
||||
if ( ! isset( $transient->response ) || ! is_array( $transient->response ) ) {
|
||||
$transient->response = array();
|
||||
}
|
||||
|
||||
$transient->response[ $this->plugin_basename ] = $update;
|
||||
}
|
||||
|
||||
return $transient;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides plugin details for the "View details" modal.
|
||||
*
|
||||
* Hooked to `plugins_api`.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @param false|object|array<string,mixed> $result The existing result.
|
||||
* @param string $action The type of information being requested.
|
||||
* @param object $args Plugin API arguments.
|
||||
*
|
||||
* @return false|object|array<string,mixed>
|
||||
*/
|
||||
public function provide_plugin_details( $result, $action, $args ) {
|
||||
if ( 'plugin_information' !== $action ) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
if ( ! is_object( $args ) || empty( $args->slug ) || $args->slug !== $this->plugin_slug ) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
$remote = $this->get_remote_data();
|
||||
|
||||
if ( empty( $remote['version'] ) ) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
$name = isset( $remote['name'] ) && is_string( $remote['name'] ) ? $remote['name'] : ( isset( $this->plugin_data['Name'] ) ? (string) $this->plugin_data['Name'] : $this->plugin_slug );
|
||||
$slug = isset( $remote['slug'] ) && is_string( $remote['slug'] ) ? $remote['slug'] : $this->plugin_slug;
|
||||
$version = is_string( $remote['version'] ) ? $remote['version'] : '';
|
||||
$author = isset( $remote['author'] ) && is_string( $remote['author'] ) ? $remote['author'] : ( isset( $this->plugin_data['Author'] ) ? (string) $this->plugin_data['Author'] : '' );
|
||||
$homepage = isset( $remote['homepage'] ) && is_string( $remote['homepage'] ) ? $remote['homepage'] : ( isset( $this->plugin_data['PluginURI'] ) ? (string) $this->plugin_data['PluginURI'] : '' );
|
||||
$requires = isset( $remote['requires'] ) && is_string( $remote['requires'] ) ? $remote['requires'] : '';
|
||||
$tested = isset( $remote['tested'] ) && is_string( $remote['tested'] ) ? $remote['tested'] : '';
|
||||
$req_php = isset( $remote['requires_php'] ) && is_string( $remote['requires_php'] ) ? $remote['requires_php'] : '';
|
||||
$description = isset( $remote['description'] ) && is_string( $remote['description'] ) ? $remote['description'] : ( isset( $this->plugin_data['Description'] ) ? (string) $this->plugin_data['Description'] : '' );
|
||||
$changelog = isset( $remote['changelog'] ) && is_string( $remote['changelog'] ) ? $remote['changelog'] : '';
|
||||
$download = isset( $remote['download_url'] ) && is_string( $remote['download_url'] ) ? $remote['download_url'] : '';
|
||||
|
||||
return (object) array(
|
||||
'name' => $name,
|
||||
'slug' => $slug,
|
||||
'version' => $version,
|
||||
'author' => $author,
|
||||
'homepage' => $homepage,
|
||||
'requires' => $requires,
|
||||
'tested' => $tested,
|
||||
'requires_php' => $req_php,
|
||||
'sections' => array(
|
||||
'description' => $description,
|
||||
'changelog' => $changelog,
|
||||
),
|
||||
'download_link' => $download,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the remote update data, reading from cache or fetching fresh.
|
||||
*
|
||||
* The data is stored with an HMAC signature (using AUTH_SALT) to detect
|
||||
* cache tampering. Falls back to unsigned caching when AUTH_SALT is empty.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @return array<string,mixed>
|
||||
*/
|
||||
private function get_remote_data() {
|
||||
$cached = get_site_transient( $this->cache_key );
|
||||
|
||||
// Verify HMAC signature when AUTH_SALT is available.
|
||||
if ( false !== $cached && defined( 'AUTH_SALT' ) && '' !== AUTH_SALT ) {
|
||||
if ( is_array( $cached ) && isset( $cached['signature'], $cached['data'] ) && is_string( $cached['signature'] ) ) {
|
||||
$payload_data = is_array( $cached['data'] ) ? $cached['data'] : array();
|
||||
// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize -- Used only for HMAC; data is never unserialized.
|
||||
$expected_sig = hash_hmac( 'sha256', $this->cache_key . serialize( $payload_data ), AUTH_SALT );
|
||||
|
||||
if ( hash_equals( $expected_sig, $cached['signature'] ) ) {
|
||||
return $payload_data;
|
||||
}
|
||||
|
||||
// Signature invalid — delete corrupted cache entry.
|
||||
delete_site_transient( $this->cache_key );
|
||||
$cached = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( false !== $cached ) {
|
||||
// Legacy cache format (no HMAC).
|
||||
return is_array( $cached ) ? $cached : array();
|
||||
}
|
||||
|
||||
$remote = $this->fetch_json();
|
||||
$data = is_array( $remote ) ? $remote : array();
|
||||
|
||||
if ( defined( 'AUTH_SALT' ) && '' !== AUTH_SALT ) {
|
||||
// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize -- Used only for HMAC; data is never unserialized.
|
||||
$signature = hash_hmac( 'sha256', $this->cache_key . serialize( $data ), AUTH_SALT );
|
||||
$payload = array(
|
||||
'data' => $data,
|
||||
'timestamp' => time(),
|
||||
'signature' => $signature,
|
||||
);
|
||||
set_site_transient( $this->cache_key, $payload, 6 * HOUR_IN_SECONDS );
|
||||
} else {
|
||||
set_site_transient( $this->cache_key, $data, 6 * HOUR_IN_SECONDS );
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches and decodes the remote update.json file.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @return array<string,mixed>
|
||||
*/
|
||||
private function fetch_json() {
|
||||
$response = wp_remote_get(
|
||||
$this->json_url,
|
||||
array(
|
||||
'timeout' => 10,
|
||||
'headers' => array(
|
||||
'Accept' => 'application/json',
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
if ( is_wp_error( $response ) ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$code = (int) wp_remote_retrieve_response_code( $response );
|
||||
|
||||
if ( $code < 200 || $code >= 300 ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$body = wp_remote_retrieve_body( $response );
|
||||
$data = json_decode( $body, true );
|
||||
|
||||
return is_array( $data ) ? $data : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the remote version is compatible with the current environment.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @param array<string,mixed> $remote Remote update data.
|
||||
*
|
||||
* @return bool True if compatible.
|
||||
*/
|
||||
private function is_compatible( array $remote ) {
|
||||
if ( isset( $remote['requires_php'] ) && is_string( $remote['requires_php'] ) && '' !== $remote['requires_php'] ) {
|
||||
if ( version_compare( PHP_VERSION, $remote['requires_php'], '<' ) ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isset( $remote['requires'] ) && is_string( $remote['requires'] ) && '' !== $remote['requires'] ) {
|
||||
if ( version_compare( (string) get_bloginfo( 'version' ), $remote['requires'], '<' ) ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a manual cache-clear request triggered via a URL parameter.
|
||||
*
|
||||
* Validates nonce and capability before clearing.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle_cache_clear() {
|
||||
$clear_cache = filter_input( INPUT_GET, 'robotstxt_clear_update_cache', FILTER_UNSAFE_RAW );
|
||||
|
||||
if ( null === $clear_cache ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$nonce_raw = filter_input( INPUT_GET, '_wpnonce', FILTER_UNSAFE_RAW );
|
||||
$nonce = is_string( $nonce_raw ) ? sanitize_text_field( wp_unslash( $nonce_raw ) ) : '';
|
||||
|
||||
if ( ! wp_verify_nonce( $nonce, 'robotstxt_clear_update_cache' ) ) {
|
||||
wp_die( esc_html__( 'Security check failed.', 'robotstxt-ai-translator' ) );
|
||||
}
|
||||
|
||||
if ( ! current_user_can( 'update_plugins' ) ) {
|
||||
wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'robotstxt-ai-translator' ) );
|
||||
}
|
||||
|
||||
$this->clear_cache();
|
||||
wp_safe_redirect( remove_query_arg( array( 'robotstxt_clear_update_cache', '_wpnonce' ) ) );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the cached remote data for this plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function clear_cache() {
|
||||
delete_site_transient( $this->cache_key );
|
||||
delete_site_transient( 'update_plugins' );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -59,25 +59,15 @@ if ( ! class_exists( 'AI_Translator_Admin' ) ) {
|
|||
*/
|
||||
private $settings;
|
||||
|
||||
/**
|
||||
* Manager presence notice handler.
|
||||
*
|
||||
* @since 1.2.2
|
||||
* @var AI_Translator_Manager_Notice
|
||||
*/
|
||||
private $manager_notice;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @param AI_Translator_Settings $settings Settings handler.
|
||||
* @param AI_Translator_Manager_Notice $manager_notice Manager notice handler.
|
||||
*/
|
||||
public function __construct( AI_Translator_Settings $settings, AI_Translator_Manager_Notice $manager_notice ) {
|
||||
public function __construct( AI_Translator_Settings $settings ) {
|
||||
$this->settings = $settings;
|
||||
$this->manager_notice = $manager_notice;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -205,8 +195,6 @@ if ( ! class_exists( 'AI_Translator_Admin' ) ) {
|
|||
<div class="wrap">
|
||||
<h1><?php echo esc_html__( 'AI Translator Settings', 'robotstxt-ai-translator' ); ?></h1>
|
||||
|
||||
<?php $this->manager_notice->render_settings_notice(); ?>
|
||||
|
||||
<?php if ( $updated ) : ?>
|
||||
<div class="notice notice-success is-dismissible">
|
||||
<p><?php echo esc_html__( 'Settings saved.', 'robotstxt-ai-translator' ); ?></p>
|
||||
|
|
@ -341,8 +329,6 @@ if ( ! class_exists( 'AI_Translator_Admin' ) ) {
|
|||
<div class="wrap">
|
||||
<h1><?php echo esc_html__( 'AI Translator Network Settings', 'robotstxt-ai-translator' ); ?></h1>
|
||||
|
||||
<?php $this->manager_notice->render_settings_notice(); ?>
|
||||
|
||||
<?php if ( $updated ) : ?>
|
||||
<div class="notice notice-success is-dismissible">
|
||||
<p><?php echo esc_html__( 'Network settings saved.', 'robotstxt-ai-translator' ); ?></p>
|
||||
|
|
|
|||
|
|
@ -1,191 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Manager (by ROBOTSTXT) presence detection and admin notices.
|
||||
*
|
||||
* Updates for the ROBOTSTXT plugin ecosystem are delivered through
|
||||
* Manager (by ROBOTSTXT). When Manager is missing or inactive, this
|
||||
* component nudges the administrator:
|
||||
*
|
||||
* - On the Plugins list screens (site and network): a dismissible admin notice.
|
||||
* - On this plugin's settings pages: a persistent (non-dismissible) warning.
|
||||
*
|
||||
* @package ROBOTSTXT\AI_Translator
|
||||
* @since 1.2.2
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'AI_Translator_Manager_Notice' ) ) {
|
||||
|
||||
/**
|
||||
* Detects Manager (by ROBOTSTXT) and renders admin notices.
|
||||
*
|
||||
* @since 1.2.2
|
||||
*/
|
||||
class AI_Translator_Manager_Notice {
|
||||
|
||||
/**
|
||||
* Manager plugin slug (directory name).
|
||||
*
|
||||
* @since 1.2.2
|
||||
* @var string
|
||||
*/
|
||||
const MANAGER_SLUG = 'robotstxt-manager';
|
||||
|
||||
/**
|
||||
* Manager plugin page on the ROBOTSTXT software site.
|
||||
*
|
||||
* @since 1.2.2
|
||||
* @var string
|
||||
*/
|
||||
const MANAGER_URL = 'https://www.robotstxt.software/plugins/robotstxt-manager/';
|
||||
|
||||
/**
|
||||
* Option key storing the dismissed state of the plugins-screen notice.
|
||||
*
|
||||
* @since 1.2.2
|
||||
* @var string
|
||||
*/
|
||||
const DISMISSED_OPTION = 'ai_translator_manager_notice_dismissed';
|
||||
|
||||
/**
|
||||
* Registers the WordPress hooks.
|
||||
*
|
||||
* @since 1.2.2
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register() {
|
||||
add_action( 'admin_init', array( $this, 'handle_dismiss' ) );
|
||||
add_action( 'admin_notices', array( $this, 'render_plugins_screen_notice' ) );
|
||||
add_action( 'network_admin_notices', array( $this, 'render_plugins_screen_notice' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether Manager (by ROBOTSTXT) is installed and active.
|
||||
*
|
||||
* Uses the ecosystem presence constant (Manager 1.6.2+) and falls back
|
||||
* to a plugin-list scan for older Manager versions.
|
||||
*
|
||||
* @since 1.2.2
|
||||
* @since 1.2.3 Added the ROBOTSTXT_MANAGER_NOTICED presence-constant check.
|
||||
*
|
||||
* @return bool True when Manager is present and activated.
|
||||
*/
|
||||
public function is_manager_active() {
|
||||
if ( defined( 'ROBOTSTXT_MANAGER_NOTICED' ) && ROBOTSTXT_MANAGER_NOTICED ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( ! function_exists( 'get_plugins' ) ) {
|
||||
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
||||
}
|
||||
|
||||
$all_plugins = get_plugins();
|
||||
|
||||
foreach ( $all_plugins as $file => $data ) {
|
||||
$slug = dirname( $file );
|
||||
|
||||
if ( '.' === $slug ) {
|
||||
$slug = basename( $file, '.php' );
|
||||
}
|
||||
|
||||
if ( self::MANAGER_SLUG === $slug ) {
|
||||
return is_plugin_active( $file );
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Persists the dismissal of the plugins-screen notice, then redirects
|
||||
* back to a clean URL.
|
||||
*
|
||||
* @since 1.2.2
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle_dismiss() {
|
||||
if ( ! isset( $_GET['ai_translator_dismiss_manager_notice'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- verified below before any state change.
|
||||
return;
|
||||
}
|
||||
|
||||
check_admin_referer( 'ai_translator_dismiss_manager_notice' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
update_option( self::DISMISSED_OPTION, '1', false );
|
||||
|
||||
wp_safe_redirect( remove_query_arg( array( 'ai_translator_dismiss_manager_notice', '_wpnonce' ) ) );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the dismissible notice on the Plugins list screens when
|
||||
* Manager is missing or inactive.
|
||||
*
|
||||
* @since 1.2.2
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function render_plugins_screen_notice() {
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
|
||||
|
||||
if ( ! is_object( $screen ) || ! in_array( $screen->id, array( 'plugins', 'plugins-network' ), true ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $this->is_manager_active() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( '1' === get_option( self::DISMISSED_OPTION, '' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$dismiss_url = wp_nonce_url(
|
||||
add_query_arg( 'ai_translator_dismiss_manager_notice', '1' ),
|
||||
'ai_translator_dismiss_manager_notice'
|
||||
);
|
||||
|
||||
printf(
|
||||
'<div class="notice notice-warning"><p>%1$s <a href="%2$s" target="_blank" rel="noopener noreferrer">%3$s</a> — <a href="%4$s">%5$s</a></p></div>',
|
||||
esc_html__( 'To get updates for the ROBOTSTXT plugins, the plugin below must be installed and active:', 'robotstxt-ai-translator' ),
|
||||
esc_url( self::MANAGER_URL ),
|
||||
esc_html__( 'Manager (by ROBOTSTXT)', 'robotstxt-ai-translator' ),
|
||||
esc_url( $dismiss_url ),
|
||||
esc_html__( 'Dismiss this notice', 'robotstxt-ai-translator' )
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the persistent (non-dismissible) warning for the settings
|
||||
* pages when Manager is missing or inactive.
|
||||
*
|
||||
* @since 1.2.2
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function render_settings_notice() {
|
||||
if ( $this->is_manager_active() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
printf(
|
||||
'<div class="notice notice-warning inline"><p>%1$s <a href="%2$s" target="_blank" rel="noopener noreferrer">%3$s</a></p></div>',
|
||||
esc_html__( 'To get updates for the ROBOTSTXT plugins, the plugin below must be installed and active:', 'robotstxt-ai-translator' ),
|
||||
esc_url( self::MANAGER_URL ),
|
||||
esc_html__( 'Manager (by ROBOTSTXT)', 'robotstxt-ai-translator' )
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
|
@ -1,16 +1,15 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: AI Translator (by ROBOTSTXT) 1.2.3\n"
|
||||
"Report-Msgid-Bugs-To: https://www.robotstxt.software/plugins/robotstxt-ai-"
|
||||
"translator/\n"
|
||||
"POT-Creation-Date: 2026-08-24T11:03:38+00:00\n"
|
||||
"PO-Revision-Date: 2026-08-24 11:17+0000\n"
|
||||
"Project-Id-Version: AI Translator (by ROBOTSTXT) 1.2.0\n"
|
||||
"Report-Msgid-Bugs-To: https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator\n"
|
||||
"Last-Translator: ROBOTSTXT <hello@robotstxt.es>\n"
|
||||
"Language-Team: Catalan\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"POT-Creation-Date: 2026-05-23T10:07:42+00:00\n"
|
||||
"PO-Revision-Date: 2026-05-23 10:30+0000\n"
|
||||
"Language: ca\n"
|
||||
"X-Generator: hand-written\n"
|
||||
"X-Domain: robotstxt-ai-translator\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
|
@ -20,353 +19,218 @@ msgstr ""
|
|||
msgid "AI Translator (by ROBOTSTXT)"
|
||||
msgstr "AI Translator (by ROBOTSTXT)"
|
||||
|
||||
#. Plugin URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://www.robotstxt.software/plugins/robotstxt-ai-translator/"
|
||||
msgstr ""
|
||||
|
||||
#. Description of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid ""
|
||||
"Translate post titles and content from the editor using the native WordPress "
|
||||
"AI client (available in WP 7.0+). Multisite-ready with global or per-site "
|
||||
"configuration."
|
||||
msgstr ""
|
||||
"Tradueix títols i contingut de les entrades des de l'editor usant el client "
|
||||
"d'IA natiu de WordPress (disponible al WP 7.0+). Preparat per a multilloc "
|
||||
"amb configuració global o per lloc."
|
||||
|
||||
#. Author of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "ROBOTSTXT"
|
||||
msgstr "ROBOTSTXT"
|
||||
|
||||
#. Author URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://www.robotstxt.software/"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:122
|
||||
#: includes/class-ai-translator-admin.php:123
|
||||
#: includes/class-ai-translator-admin.php:140
|
||||
#: includes/class-ai-translator-admin.php:141
|
||||
#: includes/class-ai-translator-editor-ui.php:402
|
||||
#: includes/class-ai-translator-editor-ui.php:558
|
||||
#: includes/class-ai-translator-admin.php:112
|
||||
#: includes/class-ai-translator-admin.php:113
|
||||
#: includes/class-ai-translator-admin.php:130
|
||||
#: includes/class-ai-translator-admin.php:131
|
||||
#: includes/class-ai-translator-editor-ui.php:294
|
||||
#: includes/class-ai-translator-editor-ui.php:446
|
||||
msgid "AI Translator"
|
||||
msgstr "AI Translator"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:163
|
||||
#: includes/class-ai-translator-admin.php:181
|
||||
#: includes/class-ai-translator-admin.php:153
|
||||
#: includes/class-ai-translator-admin.php:171
|
||||
msgid "Settings"
|
||||
msgstr "Ajustaments"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:197
|
||||
#: includes/class-ai-translator-admin.php:333
|
||||
#: includes/class-ai-translator-admin.php:187
|
||||
#: includes/class-ai-translator-admin.php:287
|
||||
msgid "You do not have permission to access this page."
|
||||
msgstr "No tens permís per accedir a aquesta pàgina."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:206
|
||||
#: includes/class-ai-translator-admin.php:196
|
||||
msgid "AI Translator Settings"
|
||||
msgstr "Ajustaments d'AI Translator"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:212
|
||||
#: includes/class-ai-translator-admin.php:200
|
||||
msgid "Settings saved."
|
||||
msgstr "Ajustaments desats."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:223
|
||||
#: includes/class-ai-translator-admin.php:226
|
||||
#: includes/class-ai-translator-admin.php:378
|
||||
#: includes/class-ai-translator-admin.php:382
|
||||
#: includes/class-ai-translator-admin.php:211
|
||||
#: includes/class-ai-translator-admin.php:214
|
||||
#: includes/class-ai-translator-admin.php:330
|
||||
#: includes/class-ai-translator-admin.php:334
|
||||
msgid "Translation fields"
|
||||
msgstr "Camps a traduir"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:230
|
||||
#: includes/class-ai-translator-admin.php:386
|
||||
#: includes/class-ai-translator-editor-ui.php:565
|
||||
#: includes/class-ai-translator-admin.php:218
|
||||
#: includes/class-ai-translator-admin.php:338
|
||||
#: includes/class-ai-translator-editor-ui.php:453
|
||||
msgid "Translate title"
|
||||
msgstr "Tradueix el títol"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:235
|
||||
#: includes/class-ai-translator-admin.php:391
|
||||
#: includes/class-ai-translator-editor-ui.php:566
|
||||
#: includes/class-ai-translator-admin.php:223
|
||||
#: includes/class-ai-translator-admin.php:343
|
||||
#: includes/class-ai-translator-editor-ui.php:454
|
||||
msgid "Translate content"
|
||||
msgstr "Tradueix el contingut"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:240
|
||||
#: includes/class-ai-translator-admin.php:396
|
||||
#: includes/class-ai-translator-editor-ui.php:567
|
||||
msgid "Translate excerpt"
|
||||
msgstr "Traduir l'extracte"
|
||||
|
||||
#. translators: 1: title default, 2: content default, 3: excerpt default.
|
||||
#: includes/class-ai-translator-admin.php:248
|
||||
#, php-format
|
||||
msgid "Network defaults: title %1$s, content %2$s, excerpt %3$s."
|
||||
msgstr ""
|
||||
"Valors predeterminats de la xarxa: títol %1$s, contingut %2$s, extracte %3$s."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:249
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:251
|
||||
#: includes/class-ai-translator-admin.php:237
|
||||
#: includes/class-ai-translator-admin.php:238
|
||||
#: includes/class-ai-translator-admin.php:239
|
||||
msgid "enabled"
|
||||
msgstr "activat"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:249
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:251
|
||||
#: includes/class-ai-translator-admin.php:237
|
||||
#: includes/class-ai-translator-admin.php:238
|
||||
#: includes/class-ai-translator-admin.php:239
|
||||
msgid "disabled"
|
||||
msgstr "desactivat"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:262
|
||||
#: includes/class-ai-translator-admin.php:408
|
||||
msgid "Request timeout"
|
||||
msgstr "Temps màxim de resposta"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:275
|
||||
#: includes/class-ai-translator-admin.php:421
|
||||
msgid "seconds"
|
||||
msgstr "segons"
|
||||
|
||||
#. translators: %d: PHP max_execution_time in seconds.
|
||||
#: includes/class-ai-translator-admin.php:283
|
||||
#: includes/class-ai-translator-admin.php:429
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Maximum time the server waits for an AI response. PHP max_execution_time is "
|
||||
"%d s — values above this have no effect."
|
||||
msgstr ""
|
||||
"Temps màxim que el servidor espera una resposta de la IA. El "
|
||||
"max_execution_time de PHP és de %d s — els valors superiors no tenen efecte."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:287
|
||||
#: includes/class-ai-translator-admin.php:433
|
||||
msgid ""
|
||||
"Maximum time the server waits for an AI response. PHP max_execution_time is "
|
||||
"unlimited."
|
||||
msgstr ""
|
||||
"Temps màxim que el servidor espera una resposta de la IA. El "
|
||||
"max_execution_time de PHP és il·limitat."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:296
|
||||
#: includes/class-ai-translator-admin.php:299
|
||||
#: includes/class-ai-translator-admin.php:442
|
||||
#: includes/class-ai-translator-admin.php:445
|
||||
msgid "MultilingualPress"
|
||||
msgstr "MultilingualPress"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:303
|
||||
#: includes/class-ai-translator-admin.php:449
|
||||
msgid "Auto-translate new connected posts"
|
||||
msgstr "Traduir automàticament les entrades connectades noves"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:307
|
||||
#: includes/class-ai-translator-admin.php:453
|
||||
msgid ""
|
||||
"When MultilingualPress creates a new connected post, automatically translate "
|
||||
"its enabled fields into the target site's language. The translation runs "
|
||||
"synchronously during save."
|
||||
msgstr ""
|
||||
"Quan MultilingualPress crea una entrada connectada nova, tradueix "
|
||||
"automàticament els camps activats a l'idioma del lloc de destinació. La "
|
||||
"traducció s'executa de manera síncrona en desar."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:342
|
||||
msgid "AI Translator Network Settings"
|
||||
msgstr "Ajustaments de xarxa d'AI Translator"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:348
|
||||
#: includes/class-ai-translator-admin.php:300
|
||||
msgid "Network settings saved."
|
||||
msgstr "Ajustaments de xarxa desats."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:358
|
||||
#: includes/class-ai-translator-admin.php:361
|
||||
#: includes/class-ai-translator-admin.php:310
|
||||
#: includes/class-ai-translator-admin.php:313
|
||||
msgid "Configuration mode"
|
||||
msgstr "Mode de configuració"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:365
|
||||
#: includes/class-ai-translator-admin.php:317
|
||||
msgid "Global configuration: a single setting applies to every site."
|
||||
msgstr "Configuració global: un sol ajustament s'aplica a tots els llocs."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:370
|
||||
#: includes/class-ai-translator-admin.php:322
|
||||
msgid "Per-site configuration: each site can override these defaults."
|
||||
msgstr ""
|
||||
"Configuració per lloc: cada lloc pot sobreescriure aquests valors "
|
||||
"predeterminats."
|
||||
msgstr "Configuració per lloc: cada lloc pot sobreescriure aquests valors predeterminats."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:400
|
||||
msgid ""
|
||||
"In global mode this is the configuration for the whole network. In per-site "
|
||||
"mode these values are used as defaults for sites that have not been "
|
||||
"configured individually."
|
||||
msgstr ""
|
||||
"En mode global aquesta és la configuració per a tota la xarxa. En mode per "
|
||||
"lloc aquests valors s'utilitzen com a predeterminats per als llocs que no "
|
||||
"s'hagin configurat individualment."
|
||||
#: includes/class-ai-translator-admin.php:352
|
||||
msgid "In global mode this is the configuration for the whole network. In per-site mode these values are used as defaults for sites that have not been configured individually."
|
||||
msgstr "En mode global aquesta és la configuració per a tota la xarxa. En mode per lloc aquests valors s'utilitzen com a predeterminats per als llocs que no s'hagin configurat individualment."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:479
|
||||
#: includes/class-ai-translator-admin.php:511
|
||||
#: includes/class-ai-translator-admin.php:397
|
||||
#: includes/class-ai-translator-admin.php:429
|
||||
msgid "You do not have permission to perform this action."
|
||||
msgstr "No tens permís per dur a terme aquesta acció."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:555
|
||||
#: includes/class-ai-translator-admin.php:473
|
||||
msgid "Recommended models"
|
||||
msgstr "Models recomanats"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:558
|
||||
msgid ""
|
||||
"This plugin does not call AI providers directly. Configure your preferred "
|
||||
"provider in the WordPress AI plugin settings. The table below is a guide to "
|
||||
"help you pick a model based on your translation use case."
|
||||
msgstr ""
|
||||
"Aquest connector no truca directament als proveïdors d'IA. Configura el teu "
|
||||
"proveïdor preferit als ajustaments del connector WordPress AI. La taula "
|
||||
"següent és una guia per ajudar-te a triar un model segons el teu cas d'ús de "
|
||||
"traducció."
|
||||
#: includes/class-ai-translator-admin.php:476
|
||||
msgid "This plugin does not call AI providers directly. Configure your preferred provider in the WordPress AI plugin settings. The table below is a guide to help you pick a model based on your translation use case."
|
||||
msgstr "Aquest connector no truca directament als proveïdors d'IA. Configura el teu proveïdor preferit als ajustaments del connector WordPress AI. La taula següent és una guia per ajudar-te a triar un model segons el teu cas d'ús de traducció."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:564
|
||||
#: includes/class-ai-translator-admin.php:482
|
||||
msgid "Use case"
|
||||
msgstr "Cas d'ús"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:565
|
||||
#: includes/class-ai-translator-admin.php:483
|
||||
msgid "Recommended model"
|
||||
msgstr "Model recomanat"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:566
|
||||
#: includes/class-ai-translator-admin.php:484
|
||||
msgid "Why"
|
||||
msgstr "Per què"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:581
|
||||
msgid ""
|
||||
"These recommendations are based on public benchmarks and community feedback "
|
||||
"as of the plugin release date. They may change as providers update their "
|
||||
"models."
|
||||
msgstr ""
|
||||
"Aquestes recomanacions es basen en benchmarks públics i comentaris de la "
|
||||
"comunitat en la data de publicació del connector. Poden canviar a mesura que "
|
||||
"els proveïdors actualitzin els seus models."
|
||||
#: includes/class-ai-translator-admin.php:499
|
||||
msgid "These recommendations are based on public benchmarks and community feedback as of the plugin release date. They may change as providers update their models."
|
||||
msgstr "Aquestes recomanacions es basen en benchmarks públics i comentaris de la comunitat en la data de publicació del connector. Poden canviar a mesura que els proveïdors actualitzin els seus models."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:596
|
||||
#: includes/class-ai-translator-admin.php:514
|
||||
msgid "European languages (ES, CA, FR, DE, IT, PT)"
|
||||
msgstr "Llengües europees (ES, CA, FR, DE, IT, PT)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:597
|
||||
#: includes/class-ai-translator-admin.php:515
|
||||
msgid "DeepL API Pro"
|
||||
msgstr "DeepL API Pro"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:598
|
||||
msgid ""
|
||||
"Best fluency and naturalness (92/100 in benchmarks). Formality control and "
|
||||
"custom glossaries."
|
||||
msgstr ""
|
||||
"La millor fluïdesa i naturalitat (92/100 en benchmarks). Control de "
|
||||
"formalitat i glossaris personalitzats."
|
||||
#: includes/class-ai-translator-admin.php:516
|
||||
msgid "Best fluency and naturalness (92/100 in benchmarks). Formality control and custom glossaries."
|
||||
msgstr "La millor fluïdesa i naturalitat (92/100 en benchmarks). Control de formalitat i glossaris personalitzats."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:601
|
||||
#: includes/class-ai-translator-admin.php:519
|
||||
msgid "Asian languages (ZH, JA, KO)"
|
||||
msgstr "Llengües asiàtiques (ZH, JA, KO)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:602
|
||||
#: includes/class-ai-translator-admin.php:520
|
||||
msgid "GPT-4o / GPT-5 or Claude Sonnet 4"
|
||||
msgstr "GPT-4o / GPT-5 o Claude Sonnet 4"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:603
|
||||
msgid ""
|
||||
"Better handling of implicit subjects, honorifics, and cultural references. "
|
||||
"DeepL falls behind here."
|
||||
msgstr ""
|
||||
"Millor gestió dels subjectes implícits, els honorífics i les referències "
|
||||
"culturals. DeepL queda enrere aquí."
|
||||
#: includes/class-ai-translator-admin.php:521
|
||||
msgid "Better handling of implicit subjects, honorifics, and cultural references. DeepL falls behind here."
|
||||
msgstr "Millor gestió dels subjectes implícits, els honorífics i les referències culturals. DeepL queda enrere aquí."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:606
|
||||
#: includes/class-ai-translator-admin.php:524
|
||||
msgid "Marketing / brand tone"
|
||||
msgstr "Màrqueting / to de marca"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:607
|
||||
#: includes/class-ai-translator-admin.php:525
|
||||
msgid "Claude Sonnet 4 / Opus 4"
|
||||
msgstr "Claude Sonnet 4 / Opus 4"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:608
|
||||
msgid ""
|
||||
"Better preservation of tone, brand voice, and nuance. Ideal for creative "
|
||||
"copy."
|
||||
msgstr ""
|
||||
"Preserva millor el to, la veu de la marca i els matisos. Ideal per a copy "
|
||||
"creatiu."
|
||||
#: includes/class-ai-translator-admin.php:526
|
||||
msgid "Better preservation of tone, brand voice, and nuance. Ideal for creative copy."
|
||||
msgstr "Preserva millor el to, la veu de la marca i els matisos. Ideal per a copy creatiu."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:611
|
||||
#: includes/class-ai-translator-admin.php:529
|
||||
msgid "Technical documentation / code"
|
||||
msgstr "Documentació tècnica / codi"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:612
|
||||
#: includes/class-ai-translator-admin.php:530
|
||||
msgid "GPT-4o / GPT-5"
|
||||
msgstr "GPT-4o / GPT-5"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:613
|
||||
msgid ""
|
||||
"Higher accuracy with variables, structured formats, and technical "
|
||||
"terminology."
|
||||
msgstr ""
|
||||
"Major precisió amb variables, formats estructurats i terminologia tècnica."
|
||||
#: includes/class-ai-translator-admin.php:531
|
||||
msgid "Higher accuracy with variables, structured formats, and technical terminology."
|
||||
msgstr "Major precisió amb variables, formats estructurats i terminologia tècnica."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:616
|
||||
#: includes/class-ai-translator-admin.php:534
|
||||
msgid "Long documents (100+ pages)"
|
||||
msgstr "Documents llargs (més de 100 pàgines)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:617
|
||||
#: includes/class-ai-translator-admin.php:535
|
||||
msgid "Gemini 2.5 Pro"
|
||||
msgstr "Gemini 2.5 Pro"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:618
|
||||
msgid ""
|
||||
"1M token context window. Maintains terminological consistency across long "
|
||||
"texts."
|
||||
msgstr ""
|
||||
"Finestra de context d'1 milió de tokens. Manté la consistència terminològica "
|
||||
"en textos llargs."
|
||||
#: includes/class-ai-translator-admin.php:536
|
||||
msgid "1M token context window. Maintains terminological consistency across long texts."
|
||||
msgstr "Finestra de context d'1 milió de tokens. Manté la consistència terminològica en textos llargs."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:621
|
||||
#: includes/class-ai-translator-admin.php:539
|
||||
msgid "High volume / low cost"
|
||||
msgstr "Alt volum / baix cost"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:622
|
||||
#: includes/class-ai-translator-admin.php:540
|
||||
msgid "DeepSeek-V3"
|
||||
msgstr "DeepSeek-V3"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:623
|
||||
msgid ""
|
||||
"Quality comparable to GPT-5 at ~$0.14/M tokens (20-50x cheaper than Claude/"
|
||||
"GPT)."
|
||||
msgstr ""
|
||||
"Qualitat comparable a GPT-5 a ~0,14 $/M tokens (entre 20 i 50 vegades més "
|
||||
"barat que Claude/GPT)."
|
||||
#: includes/class-ai-translator-admin.php:541
|
||||
msgid "Quality comparable to GPT-5 at ~$0.14/M tokens (20-50x cheaper than Claude/GPT)."
|
||||
msgstr "Qualitat comparable a GPT-5 a ~0,14 $/M tokens (entre 20 i 50 vegades més barat que Claude/GPT)."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:626
|
||||
#: includes/class-ai-translator-admin.php:544
|
||||
msgid "Rare / indigenous languages"
|
||||
msgstr "Llengües rares / indígenes"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:627
|
||||
#: includes/class-ai-translator-admin.php:545
|
||||
msgid "Claude Sonnet or Taskade Translate (multi-model routing)"
|
||||
msgstr "Claude Sonnet o Taskade Translate (encaminament multimodel)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:628
|
||||
#: includes/class-ai-translator-admin.php:546
|
||||
msgid "Better coverage for uncommon language pairs."
|
||||
msgstr "Millor cobertura en parells de llengües poc habituals."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:631
|
||||
#: includes/class-ai-translator-admin.php:549
|
||||
msgid "Maximum coverage (133+ languages)"
|
||||
msgstr "Cobertura màxima (més de 133 llengües)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:632
|
||||
#: includes/class-ai-translator-admin.php:550
|
||||
msgid "Google Cloud Translation"
|
||||
msgstr "Google Cloud Translation"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:633
|
||||
msgid ""
|
||||
"The most complete option, though with slightly lower quality on European "
|
||||
"languages."
|
||||
msgstr ""
|
||||
"L'opció més completa, tot i que amb una qualitat lleugerament inferior en "
|
||||
"llengües europees."
|
||||
#: includes/class-ai-translator-admin.php:551
|
||||
msgid "The most complete option, though with slightly lower quality on European languages."
|
||||
msgstr "L'opció més completa, tot i que amb una qualitat lleugerament inferior en llengües europees."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:120
|
||||
msgid "The --locale flag is required."
|
||||
|
|
@ -376,37 +240,16 @@ msgstr "El paràmetre --locale és obligatori."
|
|||
msgid "The --post-id and --post-type flags are mutually exclusive."
|
||||
msgstr "Els paràmetres --post-id i --post-type són mútuament excloents."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:141
|
||||
msgid "No user context. Pass --user=<id|login> so post updates carry an author and capability checks apply."
|
||||
msgstr "Sense context d'usuari. Passa --user=<id|login> perquè les actualitzacions d'entrades tinguin autor i s'apliquin les comprovacions de capacitats."
|
||||
|
||||
#. translators: %s: locale code.
|
||||
#: includes/class-ai-translator-cli.php:133
|
||||
#, php-format
|
||||
msgid "The locale %s is not installed on this site."
|
||||
msgstr "La llengua %s no està instal·lada en aquest lloc."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:141
|
||||
msgid ""
|
||||
"No user context. Pass --user=<id|login> so post updates carry an author and "
|
||||
"capability checks apply."
|
||||
msgstr ""
|
||||
"Sense context d'usuari. Passa --user=<id|login> perquè les actualitzacions "
|
||||
"d'entrades tinguin autor i s'apliquin les comprovacions de capacitats."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:145
|
||||
#: includes/class-ai-translator-editor-ui.php:427
|
||||
#: includes/class-ai-translator-editor-ui.php:563
|
||||
#: includes/class-ai-translator-translator.php:135
|
||||
msgid "AI features are disabled for this WordPress installation."
|
||||
msgstr ""
|
||||
"Les funcions d'IA estan desactivades per a aquesta instal·lació de WordPress."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:149
|
||||
#: includes/class-ai-translator-translator.php:142
|
||||
msgid ""
|
||||
"No AI provider is configured for text generation. Open Settings → AI to set "
|
||||
"one up."
|
||||
msgstr ""
|
||||
"No hi ha cap proveïdor d'IA configurat per a la generació de text. Obre "
|
||||
"Ajustos → IA per configurar-ne un."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:155
|
||||
msgid "No translation fields are enabled in the plugin settings."
|
||||
msgstr "No hi ha cap camp de traducció activat als ajustaments del connector."
|
||||
|
|
@ -421,131 +264,169 @@ msgstr "Cap entrada coincideix amb els criteris donats."
|
|||
msgid "%1$d translated, %2$d failed (locale: %3$s)."
|
||||
msgstr "%1$d traduïdes, %2$d amb errors (llengua: %3$s)."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:229
|
||||
#: includes/class-ai-translator-editor-ui.php:298
|
||||
msgid "Post not found."
|
||||
msgstr "Entrada no trobada."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:239
|
||||
#: includes/class-ai-translator-editor-ui.php:307
|
||||
msgid "The selected language is not installed on this site."
|
||||
msgstr "La llengua seleccionada no està instal·lada en aquest lloc."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:268
|
||||
#: includes/class-ai-translator-editor-ui.php:160
|
||||
msgid "Sorry, you are not allowed to edit this post."
|
||||
msgstr "Ho sentim, no tens permís per editar aquesta entrada."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:329
|
||||
msgid ""
|
||||
"No translatable fields were selected, or the requested fields are disabled "
|
||||
"in the settings."
|
||||
msgstr ""
|
||||
"No s'ha seleccionat cap camp traduïble, o els camps sol·licitats estan "
|
||||
"desactivats als ajustaments."
|
||||
#: includes/class-ai-translator-editor-ui.php:190
|
||||
msgid "Post not found."
|
||||
msgstr "Entrada no trobada."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:429
|
||||
#: includes/class-ai-translator-editor-ui.php:562
|
||||
#: includes/class-ai-translator-editor-ui.php:199
|
||||
msgid "The selected language is not installed on this site."
|
||||
msgstr "La llengua seleccionada no està instal·lada en aquest lloc."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:221
|
||||
msgid "No translatable fields were selected, or the requested fields are disabled in the settings."
|
||||
msgstr "No s'ha seleccionat cap camp traduïble, o els camps sol·licitats estan desactivats als ajustaments."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:321
|
||||
#: includes/class-ai-translator-editor-ui.php:450
|
||||
msgid "No translation fields are enabled in settings."
|
||||
msgstr "No hi ha cap camp de traducció activat als ajustaments."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:431
|
||||
#: includes/class-ai-translator-editor-ui.php:561
|
||||
#: includes/class-ai-translator-editor-ui.php:323
|
||||
#: includes/class-ai-translator-editor-ui.php:449
|
||||
msgid "No languages are installed on this site."
|
||||
msgstr "No hi ha cap llengua instal·lada en aquest lloc."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:434
|
||||
#: includes/class-ai-translator-editor-ui.php:557
|
||||
#: includes/class-ai-translator-editor-ui.php:326
|
||||
#: includes/class-ai-translator-editor-ui.php:445
|
||||
msgid "Target language"
|
||||
msgstr "Llengua de destinació"
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:444
|
||||
#: includes/class-ai-translator-editor-ui.php:553
|
||||
#: includes/class-ai-translator-editor-ui.php:336
|
||||
#: includes/class-ai-translator-editor-ui.php:443
|
||||
msgid "Translate"
|
||||
msgstr "Tradueix"
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:449
|
||||
msgid ""
|
||||
"Save the post before translating to ensure the latest content is used. The "
|
||||
"translation replaces the current title and/or content."
|
||||
msgstr ""
|
||||
"Desa l'entrada abans de traduir perquè s'utilitzi la versió més recent. La "
|
||||
"traducció substitueix el títol i/o el contingut actuals."
|
||||
#: includes/class-ai-translator-editor-ui.php:341
|
||||
msgid "Save the post before translating to ensure the latest content is used. The translation replaces the current title and/or content."
|
||||
msgstr "Desa l'entrada abans de traduir perquè s'utilitzi la versió més recent. La traducció substitueix el títol i/o el contingut actuals."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:554
|
||||
#: includes/class-ai-translator-editor-ui.php:444
|
||||
msgid "Translating…"
|
||||
msgstr "Traduint…"
|
||||
|
||||
#. translators: 1: number of chunks translated so far, 2: total number of chunks.
|
||||
#: includes/class-ai-translator-editor-ui.php:556
|
||||
msgid "Translating… ({done}/{total})"
|
||||
msgstr "Traduint… ({done}/{total})"
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:559
|
||||
#: includes/class-ai-translator-editor-ui.php:447
|
||||
msgid "Translation applied. Review and save the post."
|
||||
msgstr "Traducció aplicada. Revisa i desa l'entrada."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:560
|
||||
#: includes/class-ai-translator-editor-ui.php:448
|
||||
msgid "Translation failed."
|
||||
msgstr "La traducció ha fallat."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:564
|
||||
msgid ""
|
||||
"You have unsaved changes. Save the post before translating to ensure the "
|
||||
"latest content is used."
|
||||
msgstr ""
|
||||
"Tens canvis sense desar. Desa l'entrada abans de traduir perquè s'utilitzi "
|
||||
"la versió més recent."
|
||||
#: includes/class-ai-translator-editor-ui.php:452
|
||||
msgid "You have unsaved changes. Save the post before translating to ensure the latest content is used."
|
||||
msgstr "Tens canvis sense desar. Desa l'entrada abans de traduir perquè s'utilitzi la versió més recent."
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:162
|
||||
#: includes/class-ai-translator-manager-notice.php:185
|
||||
msgid ""
|
||||
"To get updates for the ROBOTSTXT plugins, the plugin below must be installed "
|
||||
"and active:"
|
||||
msgstr ""
|
||||
"Per rebre actualitzacions dels plugins de ROBOTSTXT, el plugin següent ha "
|
||||
"d'estar instal·lat i actiu:"
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:164
|
||||
#: includes/class-ai-translator-manager-notice.php:187
|
||||
msgid "Manager (by ROBOTSTXT)"
|
||||
msgstr "Manager (by ROBOTSTXT)"
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:166
|
||||
msgid "Dismiss this notice"
|
||||
msgstr "Descartar aquest avís"
|
||||
|
||||
#: includes/class-ai-translator-translator.php:151
|
||||
#: includes/class-ai-translator-translator.php:102
|
||||
msgid "The target language is not installed on this site."
|
||||
msgstr "La llengua de destinació no està instal·lada en aquest lloc."
|
||||
|
||||
#. translators: %s: target language name.
|
||||
#: includes/class-ai-translator-translator.php:157
|
||||
#: includes/class-ai-translator-translator.php:108
|
||||
#, php-format
|
||||
msgid ""
|
||||
"You are a professional translator. Translate the user message into %s. "
|
||||
"Preserve any HTML, shortcodes, line breaks, and Markdown exactly as they "
|
||||
"appear. Return only the translated text, without explanations, prefaces, or "
|
||||
"quotation marks."
|
||||
msgstr ""
|
||||
"Ets un traductor professional. Tradueix el missatge de l'usuari al %s. "
|
||||
"Preserva l'HTML, els shortcodes, els salts de línia i el Markdown exactament "
|
||||
"com apareixen. Retorna només el text traduït, sense explicacions, prefacis "
|
||||
"ni cometes."
|
||||
msgid "You are a professional translator. Translate the user message into %s. Preserve any HTML, shortcodes, line breaks, and Markdown exactly as they appear. Return only the translated text, without explanations, prefaces, or quotation marks."
|
||||
msgstr "Ets un traductor professional. Tradueix el missatge de l'usuari al %s. Preserva l'HTML, els shortcodes, els salts de línia i el Markdown exactament com apareixen. Retorna només el text traduït, sense explicacions, prefacis ni cometes."
|
||||
|
||||
#: includes/class-ai-translator-translator.php:186
|
||||
#: includes/class-ai-translator-translator.php:129
|
||||
msgid "The AI service returned an unexpected response."
|
||||
msgstr "El servei d'IA ha retornat una resposta inesperada."
|
||||
|
||||
#. translators: %s: Link to the WordPress AI settings page.
|
||||
#: robotstxt-ai-translator.php:145
|
||||
#, php-format
|
||||
msgid ""
|
||||
"AI Translator (by ROBOTSTXT) requires a configured AI provider for text "
|
||||
"generation. Open %s to set one up."
|
||||
msgstr ""
|
||||
"AI Translator (by ROBOTSTXT) requereix un proveïdor d'IA configurat per a la "
|
||||
"generació de text. Obre %s per configurar-ne un."
|
||||
#: class-robotstxt-updater.php:456
|
||||
msgid "You do not have sufficient permissions to access this page."
|
||||
msgstr "No tens permisos suficients per accedir a aquesta pàgina."
|
||||
|
||||
#: robotstxt-ai-translator.php:146
|
||||
#. Plugin URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator"
|
||||
msgstr ""
|
||||
|
||||
#. Description of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "Translate post titles and content from the editor using the native WordPress AI client (available in WP 7.0+). Multisite-ready with global or per-site configuration."
|
||||
msgstr ""
|
||||
|
||||
#. Author URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://www.robotstxt.es/"
|
||||
msgstr ""
|
||||
|
||||
#: class-robotstxt-updater.php:452
|
||||
msgid "Security check failed."
|
||||
msgstr "Error de verificació de seguretat."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:228
|
||||
#: includes/class-ai-translator-admin.php:348
|
||||
#: includes/class-ai-translator-editor-ui.php:455
|
||||
msgid "Translate excerpt"
|
||||
msgstr "Traduir l'extracte"
|
||||
|
||||
#. translators: 1: title default, 2: content default, 3: excerpt default.
|
||||
#: includes/class-ai-translator-admin.php:236
|
||||
#, php-format
|
||||
msgid "Network defaults: title %1$s, content %2$s, excerpt %3$s."
|
||||
msgstr "Valors predeterminats de la xarxa: títol %1$s, contingut %2$s, extracte %3$s."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:253
|
||||
#: includes/class-ai-translator-admin.php:360
|
||||
#: includes/class-ai-translator-admin.php:363
|
||||
msgid "MultilingualPress"
|
||||
msgstr "MultilingualPress"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:257
|
||||
#: includes/class-ai-translator-admin.php:367
|
||||
msgid "Auto-translate new connected posts"
|
||||
msgstr "Traduir automàticament les entrades connectades noves"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:261
|
||||
#: includes/class-ai-translator-admin.php:371
|
||||
msgid "When MultilingualPress creates a new connected post, automatically translate its enabled fields into the target site's language. The translation runs synchronously during save."
|
||||
msgstr "Quan MultilingualPress crea una entrada connectada nova, tradueix automàticament els camps activats a l'idioma del lloc de destinació. La traducció s'executa de manera síncrona en desar."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:145
|
||||
#: includes/class-ai-translator-editor-ui.php:319
|
||||
#: includes/class-ai-translator-editor-ui.php:451
|
||||
#: includes/class-ai-translator-translator.php:86
|
||||
msgid "AI features are disabled for this WordPress installation."
|
||||
msgstr "Les funcions d'IA estan desactivades per a aquesta instal·lació de WordPress."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:149
|
||||
#: includes/class-ai-translator-translator.php:93
|
||||
msgid "No AI provider is configured for text generation. Open Settings → AI to set one up."
|
||||
msgstr "No hi ha cap proveïdor d'IA configurat per a la generació de text. Obre Ajustos → IA per configurar-ne un."
|
||||
|
||||
#. translators: %s: Link to the WordPress AI settings page.
|
||||
#: robotstxt-ai-translator.php:144
|
||||
#, php-format
|
||||
msgid "AI Translator (by ROBOTSTXT) requires a configured AI provider for text generation. Open %s to set one up."
|
||||
msgstr "AI Translator (by ROBOTSTXT) requereix un proveïdor d'IA configurat per a la generació de text. Obre %s per configurar-ne un."
|
||||
|
||||
#: robotstxt-ai-translator.php:145
|
||||
msgid "Settings → AI"
|
||||
msgstr "Ajustos → IA"
|
||||
|
||||
#: includes/class-ai-translator-admin.php
|
||||
msgid "Request timeout"
|
||||
msgstr "Temps màxim de resposta"
|
||||
|
||||
#: includes/class-ai-translator-admin.php
|
||||
msgid "seconds"
|
||||
msgstr "segons"
|
||||
|
||||
#. translators: %d: PHP max_execution_time in seconds.
|
||||
#: includes/class-ai-translator-admin.php
|
||||
#, php-format
|
||||
msgid "Maximum time the server waits for an AI response. PHP max_execution_time is %d s — values above this have no effect."
|
||||
msgstr "Temps màxim que el servidor espera una resposta de la IA. El max_execution_time de PHP és de %d s — els valors superiors no tenen efecte."
|
||||
|
||||
#: includes/class-ai-translator-admin.php
|
||||
msgid "Maximum time the server waits for an AI response. PHP max_execution_time is unlimited."
|
||||
msgstr "Temps màxim que el servidor espera una resposta de la IA. El max_execution_time de PHP és il·limitat."
|
||||
|
||||
#. translators: 1: number of chunks translated so far, 2: total number of chunks.
|
||||
#: includes/class-ai-translator-editor-ui.php
|
||||
msgid "Translating… ({done}/{total})"
|
||||
msgstr "Traduint… ({done}/{total})"
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
|
@ -1,16 +1,15 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: AI Translator (by ROBOTSTXT) 1.2.3\n"
|
||||
"Report-Msgid-Bugs-To: https://www.robotstxt.software/plugins/robotstxt-ai-"
|
||||
"translator/\n"
|
||||
"POT-Creation-Date: 2026-08-24T11:03:38+00:00\n"
|
||||
"PO-Revision-Date: 2026-08-24 11:17+0000\n"
|
||||
"Project-Id-Version: AI Translator (by ROBOTSTXT) 1.2.0\n"
|
||||
"Report-Msgid-Bugs-To: https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator\n"
|
||||
"Last-Translator: ROBOTSTXT <hello@robotstxt.es>\n"
|
||||
"Language-Team: Spanish (Spain)\n"
|
||||
"Language: es_ES\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"POT-Creation-Date: 2026-05-23T10:07:42+00:00\n"
|
||||
"PO-Revision-Date: 2026-05-23 10:30+0000\n"
|
||||
"Language: es_ES\n"
|
||||
"X-Generator: hand-written\n"
|
||||
"X-Domain: robotstxt-ai-translator\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
|
@ -20,355 +19,218 @@ msgstr ""
|
|||
msgid "AI Translator (by ROBOTSTXT)"
|
||||
msgstr "AI Translator (by ROBOTSTXT)"
|
||||
|
||||
#. Plugin URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://www.robotstxt.software/plugins/robotstxt-ai-translator/"
|
||||
msgstr ""
|
||||
|
||||
#. Description of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid ""
|
||||
"Translate post titles and content from the editor using the native WordPress "
|
||||
"AI client (available in WP 7.0+). Multisite-ready with global or per-site "
|
||||
"configuration."
|
||||
msgstr ""
|
||||
"Traduce títulos y contenido de las entradas desde el editor usando el "
|
||||
"cliente de IA nativo de WordPress (disponible en WP 7.0+). Preparado para "
|
||||
"multisitio con configuración global o por sitio."
|
||||
|
||||
#. Author of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "ROBOTSTXT"
|
||||
msgstr "ROBOTSTXT"
|
||||
|
||||
#. Author URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://www.robotstxt.software/"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:122
|
||||
#: includes/class-ai-translator-admin.php:123
|
||||
#: includes/class-ai-translator-admin.php:140
|
||||
#: includes/class-ai-translator-admin.php:141
|
||||
#: includes/class-ai-translator-editor-ui.php:402
|
||||
#: includes/class-ai-translator-editor-ui.php:558
|
||||
#: includes/class-ai-translator-admin.php:112
|
||||
#: includes/class-ai-translator-admin.php:113
|
||||
#: includes/class-ai-translator-admin.php:130
|
||||
#: includes/class-ai-translator-admin.php:131
|
||||
#: includes/class-ai-translator-editor-ui.php:294
|
||||
#: includes/class-ai-translator-editor-ui.php:446
|
||||
msgid "AI Translator"
|
||||
msgstr "AI Translator"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:163
|
||||
#: includes/class-ai-translator-admin.php:181
|
||||
#: includes/class-ai-translator-admin.php:153
|
||||
#: includes/class-ai-translator-admin.php:171
|
||||
msgid "Settings"
|
||||
msgstr "Ajustes"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:197
|
||||
#: includes/class-ai-translator-admin.php:333
|
||||
#: includes/class-ai-translator-admin.php:187
|
||||
#: includes/class-ai-translator-admin.php:287
|
||||
msgid "You do not have permission to access this page."
|
||||
msgstr "No tienes permiso para acceder a esta página."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:206
|
||||
#: includes/class-ai-translator-admin.php:196
|
||||
msgid "AI Translator Settings"
|
||||
msgstr "Ajustes de AI Translator"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:212
|
||||
#: includes/class-ai-translator-admin.php:200
|
||||
msgid "Settings saved."
|
||||
msgstr "Ajustes guardados."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:223
|
||||
#: includes/class-ai-translator-admin.php:226
|
||||
#: includes/class-ai-translator-admin.php:378
|
||||
#: includes/class-ai-translator-admin.php:382
|
||||
#: includes/class-ai-translator-admin.php:211
|
||||
#: includes/class-ai-translator-admin.php:214
|
||||
#: includes/class-ai-translator-admin.php:330
|
||||
#: includes/class-ai-translator-admin.php:334
|
||||
msgid "Translation fields"
|
||||
msgstr "Campos a traducir"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:230
|
||||
#: includes/class-ai-translator-admin.php:386
|
||||
#: includes/class-ai-translator-editor-ui.php:565
|
||||
#: includes/class-ai-translator-admin.php:218
|
||||
#: includes/class-ai-translator-admin.php:338
|
||||
#: includes/class-ai-translator-editor-ui.php:453
|
||||
msgid "Translate title"
|
||||
msgstr "Traducir título"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:235
|
||||
#: includes/class-ai-translator-admin.php:391
|
||||
#: includes/class-ai-translator-editor-ui.php:566
|
||||
#: includes/class-ai-translator-admin.php:223
|
||||
#: includes/class-ai-translator-admin.php:343
|
||||
#: includes/class-ai-translator-editor-ui.php:454
|
||||
msgid "Translate content"
|
||||
msgstr "Traducir contenido"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:240
|
||||
#: includes/class-ai-translator-admin.php:396
|
||||
#: includes/class-ai-translator-editor-ui.php:567
|
||||
msgid "Translate excerpt"
|
||||
msgstr "Traducir extracto"
|
||||
|
||||
#. translators: 1: title default, 2: content default, 3: excerpt default.
|
||||
#: includes/class-ai-translator-admin.php:248
|
||||
#, php-format
|
||||
msgid "Network defaults: title %1$s, content %2$s, excerpt %3$s."
|
||||
msgstr ""
|
||||
"Valores predeterminados de la red: título %1$s, contenido %2$s, extracto "
|
||||
"%3$s."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:249
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:251
|
||||
#: includes/class-ai-translator-admin.php:237
|
||||
#: includes/class-ai-translator-admin.php:238
|
||||
#: includes/class-ai-translator-admin.php:239
|
||||
msgid "enabled"
|
||||
msgstr "activado"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:249
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:251
|
||||
#: includes/class-ai-translator-admin.php:237
|
||||
#: includes/class-ai-translator-admin.php:238
|
||||
#: includes/class-ai-translator-admin.php:239
|
||||
msgid "disabled"
|
||||
msgstr "desactivado"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:262
|
||||
#: includes/class-ai-translator-admin.php:408
|
||||
msgid "Request timeout"
|
||||
msgstr "Tiempo máximo de respuesta"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:275
|
||||
#: includes/class-ai-translator-admin.php:421
|
||||
msgid "seconds"
|
||||
msgstr "segundos"
|
||||
|
||||
#. translators: %d: PHP max_execution_time in seconds.
|
||||
#: includes/class-ai-translator-admin.php:283
|
||||
#: includes/class-ai-translator-admin.php:429
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Maximum time the server waits for an AI response. PHP max_execution_time is "
|
||||
"%d s — values above this have no effect."
|
||||
msgstr ""
|
||||
"Tiempo máximo que el servidor espera una respuesta de la IA. El "
|
||||
"max_execution_time de PHP es de %d s — los valores superiores no tienen "
|
||||
"efecto."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:287
|
||||
#: includes/class-ai-translator-admin.php:433
|
||||
msgid ""
|
||||
"Maximum time the server waits for an AI response. PHP max_execution_time is "
|
||||
"unlimited."
|
||||
msgstr ""
|
||||
"Tiempo máximo que el servidor espera una respuesta de la IA. El "
|
||||
"max_execution_time de PHP es ilimitado."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:296
|
||||
#: includes/class-ai-translator-admin.php:299
|
||||
#: includes/class-ai-translator-admin.php:442
|
||||
#: includes/class-ai-translator-admin.php:445
|
||||
msgid "MultilingualPress"
|
||||
msgstr "MultilingualPress"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:303
|
||||
#: includes/class-ai-translator-admin.php:449
|
||||
msgid "Auto-translate new connected posts"
|
||||
msgstr "Traducir automáticamente las entradas conectadas nuevas"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:307
|
||||
#: includes/class-ai-translator-admin.php:453
|
||||
msgid ""
|
||||
"When MultilingualPress creates a new connected post, automatically translate "
|
||||
"its enabled fields into the target site's language. The translation runs "
|
||||
"synchronously during save."
|
||||
msgstr ""
|
||||
"Cuando MultilingualPress crea una entrada conectada nueva, traduce "
|
||||
"automáticamente los campos activados al idioma del sitio de destino. La "
|
||||
"traducción se ejecuta de forma síncrona al guardar."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:342
|
||||
msgid "AI Translator Network Settings"
|
||||
msgstr "Ajustes de red de AI Translator"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:348
|
||||
#: includes/class-ai-translator-admin.php:300
|
||||
msgid "Network settings saved."
|
||||
msgstr "Ajustes de red guardados."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:358
|
||||
#: includes/class-ai-translator-admin.php:361
|
||||
#: includes/class-ai-translator-admin.php:310
|
||||
#: includes/class-ai-translator-admin.php:313
|
||||
msgid "Configuration mode"
|
||||
msgstr "Modo de configuración"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:365
|
||||
#: includes/class-ai-translator-admin.php:317
|
||||
msgid "Global configuration: a single setting applies to every site."
|
||||
msgstr "Configuración global: un único ajuste se aplica a todos los sitios."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:370
|
||||
#: includes/class-ai-translator-admin.php:322
|
||||
msgid "Per-site configuration: each site can override these defaults."
|
||||
msgstr ""
|
||||
"Configuración por sitio: cada sitio puede sobrescribir estos valores por "
|
||||
"defecto."
|
||||
msgstr "Configuración por sitio: cada sitio puede sobrescribir estos valores por defecto."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:400
|
||||
msgid ""
|
||||
"In global mode this is the configuration for the whole network. In per-site "
|
||||
"mode these values are used as defaults for sites that have not been "
|
||||
"configured individually."
|
||||
msgstr ""
|
||||
"En modo global esta es la configuración para toda la red. En modo por sitio "
|
||||
"estos valores se usan como predeterminados para los sitios que no se hayan "
|
||||
"configurado individualmente."
|
||||
#: includes/class-ai-translator-admin.php:352
|
||||
msgid "In global mode this is the configuration for the whole network. In per-site mode these values are used as defaults for sites that have not been configured individually."
|
||||
msgstr "En modo global esta es la configuración para toda la red. En modo por sitio estos valores se usan como predeterminados para los sitios que no se hayan configurado individualmente."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:479
|
||||
#: includes/class-ai-translator-admin.php:511
|
||||
#: includes/class-ai-translator-admin.php:397
|
||||
#: includes/class-ai-translator-admin.php:429
|
||||
msgid "You do not have permission to perform this action."
|
||||
msgstr "No tienes permiso para realizar esta acción."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:555
|
||||
#: includes/class-ai-translator-admin.php:473
|
||||
msgid "Recommended models"
|
||||
msgstr "Modelos recomendados"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:558
|
||||
msgid ""
|
||||
"This plugin does not call AI providers directly. Configure your preferred "
|
||||
"provider in the WordPress AI plugin settings. The table below is a guide to "
|
||||
"help you pick a model based on your translation use case."
|
||||
msgstr ""
|
||||
"Este plugin no llama directamente a los proveedores de IA. Configura tu "
|
||||
"proveedor preferido en los ajustes del plugin WordPress AI. La tabla "
|
||||
"siguiente es una guía para ayudarte a elegir un modelo según tu caso de uso "
|
||||
"de traducción."
|
||||
#: includes/class-ai-translator-admin.php:476
|
||||
msgid "This plugin does not call AI providers directly. Configure your preferred provider in the WordPress AI plugin settings. The table below is a guide to help you pick a model based on your translation use case."
|
||||
msgstr "Este plugin no llama directamente a los proveedores de IA. Configura tu proveedor preferido en los ajustes del plugin WordPress AI. La tabla siguiente es una guía para ayudarte a elegir un modelo según tu caso de uso de traducción."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:564
|
||||
#: includes/class-ai-translator-admin.php:482
|
||||
msgid "Use case"
|
||||
msgstr "Caso de uso"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:565
|
||||
#: includes/class-ai-translator-admin.php:483
|
||||
msgid "Recommended model"
|
||||
msgstr "Modelo recomendado"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:566
|
||||
#: includes/class-ai-translator-admin.php:484
|
||||
msgid "Why"
|
||||
msgstr "Por qué"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:581
|
||||
msgid ""
|
||||
"These recommendations are based on public benchmarks and community feedback "
|
||||
"as of the plugin release date. They may change as providers update their "
|
||||
"models."
|
||||
msgstr ""
|
||||
"Estas recomendaciones se basan en benchmarks públicos y comentarios de la "
|
||||
"comunidad en la fecha de publicación del plugin. Pueden cambiar a medida que "
|
||||
"los proveedores actualicen sus modelos."
|
||||
#: includes/class-ai-translator-admin.php:499
|
||||
msgid "These recommendations are based on public benchmarks and community feedback as of the plugin release date. They may change as providers update their models."
|
||||
msgstr "Estas recomendaciones se basan en benchmarks públicos y comentarios de la comunidad en la fecha de publicación del plugin. Pueden cambiar a medida que los proveedores actualicen sus modelos."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:596
|
||||
#: includes/class-ai-translator-admin.php:514
|
||||
msgid "European languages (ES, CA, FR, DE, IT, PT)"
|
||||
msgstr "Idiomas europeos (ES, CA, FR, DE, IT, PT)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:597
|
||||
#: includes/class-ai-translator-admin.php:515
|
||||
msgid "DeepL API Pro"
|
||||
msgstr "DeepL API Pro"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:598
|
||||
msgid ""
|
||||
"Best fluency and naturalness (92/100 in benchmarks). Formality control and "
|
||||
"custom glossaries."
|
||||
msgstr ""
|
||||
"La mejor fluidez y naturalidad (92/100 en benchmarks). Control de formalidad "
|
||||
"y glosarios personalizados."
|
||||
#: includes/class-ai-translator-admin.php:516
|
||||
msgid "Best fluency and naturalness (92/100 in benchmarks). Formality control and custom glossaries."
|
||||
msgstr "La mejor fluidez y naturalidad (92/100 en benchmarks). Control de formalidad y glosarios personalizados."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:601
|
||||
#: includes/class-ai-translator-admin.php:519
|
||||
msgid "Asian languages (ZH, JA, KO)"
|
||||
msgstr "Idiomas asiáticos (ZH, JA, KO)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:602
|
||||
#: includes/class-ai-translator-admin.php:520
|
||||
msgid "GPT-4o / GPT-5 or Claude Sonnet 4"
|
||||
msgstr "GPT-4o / GPT-5 o Claude Sonnet 4"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:603
|
||||
msgid ""
|
||||
"Better handling of implicit subjects, honorifics, and cultural references. "
|
||||
"DeepL falls behind here."
|
||||
msgstr ""
|
||||
"Mejor manejo de sujetos implícitos, honoríficos y referencias culturales. "
|
||||
"DeepL queda por detrás aquí."
|
||||
#: includes/class-ai-translator-admin.php:521
|
||||
msgid "Better handling of implicit subjects, honorifics, and cultural references. DeepL falls behind here."
|
||||
msgstr "Mejor manejo de sujetos implícitos, honoríficos y referencias culturales. DeepL queda por detrás aquí."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:606
|
||||
#: includes/class-ai-translator-admin.php:524
|
||||
msgid "Marketing / brand tone"
|
||||
msgstr "Marketing / tono de marca"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:607
|
||||
#: includes/class-ai-translator-admin.php:525
|
||||
msgid "Claude Sonnet 4 / Opus 4"
|
||||
msgstr "Claude Sonnet 4 / Opus 4"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:608
|
||||
msgid ""
|
||||
"Better preservation of tone, brand voice, and nuance. Ideal for creative "
|
||||
"copy."
|
||||
msgstr ""
|
||||
"Preserva mejor el tono, la voz de marca y los matices. Ideal para copy "
|
||||
"creativo."
|
||||
#: includes/class-ai-translator-admin.php:526
|
||||
msgid "Better preservation of tone, brand voice, and nuance. Ideal for creative copy."
|
||||
msgstr "Preserva mejor el tono, la voz de marca y los matices. Ideal para copy creativo."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:611
|
||||
#: includes/class-ai-translator-admin.php:529
|
||||
msgid "Technical documentation / code"
|
||||
msgstr "Documentación técnica / código"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:612
|
||||
#: includes/class-ai-translator-admin.php:530
|
||||
msgid "GPT-4o / GPT-5"
|
||||
msgstr "GPT-4o / GPT-5"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:613
|
||||
msgid ""
|
||||
"Higher accuracy with variables, structured formats, and technical "
|
||||
"terminology."
|
||||
msgstr ""
|
||||
"Mayor precisión con variables, formatos estructurados y terminología técnica."
|
||||
#: includes/class-ai-translator-admin.php:531
|
||||
msgid "Higher accuracy with variables, structured formats, and technical terminology."
|
||||
msgstr "Mayor precisión con variables, formatos estructurados y terminología técnica."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:616
|
||||
#: includes/class-ai-translator-admin.php:534
|
||||
msgid "Long documents (100+ pages)"
|
||||
msgstr "Documentos largos (más de 100 páginas)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:617
|
||||
#: includes/class-ai-translator-admin.php:535
|
||||
msgid "Gemini 2.5 Pro"
|
||||
msgstr "Gemini 2.5 Pro"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:618
|
||||
msgid ""
|
||||
"1M token context window. Maintains terminological consistency across long "
|
||||
"texts."
|
||||
msgstr ""
|
||||
"Ventana de contexto de 1 millón de tokens. Mantiene la consistencia "
|
||||
"terminológica en textos extensos."
|
||||
#: includes/class-ai-translator-admin.php:536
|
||||
msgid "1M token context window. Maintains terminological consistency across long texts."
|
||||
msgstr "Ventana de contexto de 1 millón de tokens. Mantiene la consistencia terminológica en textos extensos."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:621
|
||||
#: includes/class-ai-translator-admin.php:539
|
||||
msgid "High volume / low cost"
|
||||
msgstr "Alto volumen / bajo coste"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:622
|
||||
#: includes/class-ai-translator-admin.php:540
|
||||
msgid "DeepSeek-V3"
|
||||
msgstr "DeepSeek-V3"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:623
|
||||
msgid ""
|
||||
"Quality comparable to GPT-5 at ~$0.14/M tokens (20-50x cheaper than Claude/"
|
||||
"GPT)."
|
||||
msgstr ""
|
||||
"Calidad comparable a GPT-5 a ~0,14 $/M tokens (entre 20 y 50 veces más "
|
||||
"barato que Claude/GPT)."
|
||||
#: includes/class-ai-translator-admin.php:541
|
||||
msgid "Quality comparable to GPT-5 at ~$0.14/M tokens (20-50x cheaper than Claude/GPT)."
|
||||
msgstr "Calidad comparable a GPT-5 a ~0,14 $/M tokens (entre 20 y 50 veces más barato que Claude/GPT)."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:626
|
||||
#: includes/class-ai-translator-admin.php:544
|
||||
msgid "Rare / indigenous languages"
|
||||
msgstr "Idiomas raros / indígenas"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:627
|
||||
#: includes/class-ai-translator-admin.php:545
|
||||
msgid "Claude Sonnet or Taskade Translate (multi-model routing)"
|
||||
msgstr "Claude Sonnet o Taskade Translate (enrutado multimodelo)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:628
|
||||
#: includes/class-ai-translator-admin.php:546
|
||||
msgid "Better coverage for uncommon language pairs."
|
||||
msgstr "Mejor cobertura en pares de idiomas poco comunes."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:631
|
||||
#: includes/class-ai-translator-admin.php:549
|
||||
msgid "Maximum coverage (133+ languages)"
|
||||
msgstr "Cobertura máxima (más de 133 idiomas)"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:632
|
||||
#: includes/class-ai-translator-admin.php:550
|
||||
msgid "Google Cloud Translation"
|
||||
msgstr "Google Cloud Translation"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:633
|
||||
msgid ""
|
||||
"The most complete option, though with slightly lower quality on European "
|
||||
"languages."
|
||||
msgstr ""
|
||||
"La opción más completa, aunque con calidad ligeramente inferior en idiomas "
|
||||
"europeos."
|
||||
#: includes/class-ai-translator-admin.php:551
|
||||
msgid "The most complete option, though with slightly lower quality on European languages."
|
||||
msgstr "La opción más completa, aunque con calidad ligeramente inferior en idiomas europeos."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:120
|
||||
msgid "The --locale flag is required."
|
||||
|
|
@ -378,37 +240,16 @@ msgstr "El parámetro --locale es obligatorio."
|
|||
msgid "The --post-id and --post-type flags are mutually exclusive."
|
||||
msgstr "Los parámetros --post-id y --post-type son mutuamente excluyentes."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:141
|
||||
msgid "No user context. Pass --user=<id|login> so post updates carry an author and capability checks apply."
|
||||
msgstr "Sin contexto de usuario. Pasa --user=<id|login> para que las actualizaciones de entradas tengan autor y se apliquen los controles de capacidades."
|
||||
|
||||
#. translators: %s: locale code.
|
||||
#: includes/class-ai-translator-cli.php:133
|
||||
#, php-format
|
||||
msgid "The locale %s is not installed on this site."
|
||||
msgstr "El idioma %s no está instalado en este sitio."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:141
|
||||
msgid ""
|
||||
"No user context. Pass --user=<id|login> so post updates carry an author and "
|
||||
"capability checks apply."
|
||||
msgstr ""
|
||||
"Sin contexto de usuario. Pasa --user=<id|login> para que las actualizaciones "
|
||||
"de entradas tengan autor y se apliquen los controles de capacidades."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:145
|
||||
#: includes/class-ai-translator-editor-ui.php:427
|
||||
#: includes/class-ai-translator-editor-ui.php:563
|
||||
#: includes/class-ai-translator-translator.php:135
|
||||
msgid "AI features are disabled for this WordPress installation."
|
||||
msgstr ""
|
||||
"Las funciones de IA están desactivadas para esta instalación de WordPress."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:149
|
||||
#: includes/class-ai-translator-translator.php:142
|
||||
msgid ""
|
||||
"No AI provider is configured for text generation. Open Settings → AI to set "
|
||||
"one up."
|
||||
msgstr ""
|
||||
"No hay ningún proveedor de IA configurado para la generación de texto. Abre "
|
||||
"Ajustes → IA para configurar uno."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:155
|
||||
msgid "No translation fields are enabled in the plugin settings."
|
||||
msgstr "No hay ningún campo de traducción activado en los ajustes del plugin."
|
||||
|
|
@ -423,131 +264,169 @@ msgstr "Ninguna entrada coincide con los criterios indicados."
|
|||
msgid "%1$d translated, %2$d failed (locale: %3$s)."
|
||||
msgstr "%1$d traducidas, %2$d con fallos (idioma: %3$s)."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:229
|
||||
#: includes/class-ai-translator-editor-ui.php:298
|
||||
msgid "Post not found."
|
||||
msgstr "Entrada no encontrada."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:239
|
||||
#: includes/class-ai-translator-editor-ui.php:307
|
||||
msgid "The selected language is not installed on this site."
|
||||
msgstr "El idioma seleccionado no está instalado en este sitio."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:268
|
||||
#: includes/class-ai-translator-editor-ui.php:160
|
||||
msgid "Sorry, you are not allowed to edit this post."
|
||||
msgstr "Lo sentimos, no tienes permiso para editar esta entrada."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:329
|
||||
msgid ""
|
||||
"No translatable fields were selected, or the requested fields are disabled "
|
||||
"in the settings."
|
||||
msgstr ""
|
||||
"No se ha seleccionado ningún campo traducible, o los campos solicitados "
|
||||
"están desactivados en los ajustes."
|
||||
#: includes/class-ai-translator-editor-ui.php:190
|
||||
msgid "Post not found."
|
||||
msgstr "Entrada no encontrada."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:429
|
||||
#: includes/class-ai-translator-editor-ui.php:562
|
||||
#: includes/class-ai-translator-editor-ui.php:199
|
||||
msgid "The selected language is not installed on this site."
|
||||
msgstr "El idioma seleccionado no está instalado en este sitio."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:221
|
||||
msgid "No translatable fields were selected, or the requested fields are disabled in the settings."
|
||||
msgstr "No se ha seleccionado ningún campo traducible, o los campos solicitados están desactivados en los ajustes."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:321
|
||||
#: includes/class-ai-translator-editor-ui.php:450
|
||||
msgid "No translation fields are enabled in settings."
|
||||
msgstr "No hay ningún campo de traducción activado en los ajustes."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:431
|
||||
#: includes/class-ai-translator-editor-ui.php:561
|
||||
#: includes/class-ai-translator-editor-ui.php:323
|
||||
#: includes/class-ai-translator-editor-ui.php:449
|
||||
msgid "No languages are installed on this site."
|
||||
msgstr "No hay ningún idioma instalado en este sitio."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:434
|
||||
#: includes/class-ai-translator-editor-ui.php:557
|
||||
#: includes/class-ai-translator-editor-ui.php:326
|
||||
#: includes/class-ai-translator-editor-ui.php:445
|
||||
msgid "Target language"
|
||||
msgstr "Idioma de destino"
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:444
|
||||
#: includes/class-ai-translator-editor-ui.php:553
|
||||
#: includes/class-ai-translator-editor-ui.php:336
|
||||
#: includes/class-ai-translator-editor-ui.php:443
|
||||
msgid "Translate"
|
||||
msgstr "Traducir"
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:449
|
||||
msgid ""
|
||||
"Save the post before translating to ensure the latest content is used. The "
|
||||
"translation replaces the current title and/or content."
|
||||
msgstr ""
|
||||
"Guarda la entrada antes de traducir para que se use la versión más reciente. "
|
||||
"La traducción reemplaza el título y/o el contenido actuales."
|
||||
#: includes/class-ai-translator-editor-ui.php:341
|
||||
msgid "Save the post before translating to ensure the latest content is used. The translation replaces the current title and/or content."
|
||||
msgstr "Guarda la entrada antes de traducir para que se use la versión más reciente. La traducción reemplaza el título y/o el contenido actuales."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:554
|
||||
#: includes/class-ai-translator-editor-ui.php:444
|
||||
msgid "Translating…"
|
||||
msgstr "Traduciendo…"
|
||||
|
||||
#. translators: 1: number of chunks translated so far, 2: total number of chunks.
|
||||
#: includes/class-ai-translator-editor-ui.php:556
|
||||
msgid "Translating… ({done}/{total})"
|
||||
msgstr "Traduciendo… ({done}/{total})"
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:559
|
||||
#: includes/class-ai-translator-editor-ui.php:447
|
||||
msgid "Translation applied. Review and save the post."
|
||||
msgstr "Traducción aplicada. Revisa y guarda la entrada."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:560
|
||||
#: includes/class-ai-translator-editor-ui.php:448
|
||||
msgid "Translation failed."
|
||||
msgstr "La traducción ha fallado."
|
||||
|
||||
#: includes/class-ai-translator-editor-ui.php:564
|
||||
msgid ""
|
||||
"You have unsaved changes. Save the post before translating to ensure the "
|
||||
"latest content is used."
|
||||
msgstr ""
|
||||
"Tienes cambios sin guardar. Guarda la entrada antes de traducir para que se "
|
||||
"use la versión más reciente."
|
||||
#: includes/class-ai-translator-editor-ui.php:452
|
||||
msgid "You have unsaved changes. Save the post before translating to ensure the latest content is used."
|
||||
msgstr "Tienes cambios sin guardar. Guarda la entrada antes de traducir para que se use la versión más reciente."
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:162
|
||||
#: includes/class-ai-translator-manager-notice.php:185
|
||||
msgid ""
|
||||
"To get updates for the ROBOTSTXT plugins, the plugin below must be installed "
|
||||
"and active:"
|
||||
msgstr ""
|
||||
"Para recibir actualizaciones de los plugins de ROBOTSTXT, el plugin "
|
||||
"siguiente debe estar instalado y activo:"
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:164
|
||||
#: includes/class-ai-translator-manager-notice.php:187
|
||||
msgid "Manager (by ROBOTSTXT)"
|
||||
msgstr "Manager (by ROBOTSTXT)"
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:166
|
||||
msgid "Dismiss this notice"
|
||||
msgstr "Descartar este aviso"
|
||||
|
||||
#: includes/class-ai-translator-translator.php:151
|
||||
#: includes/class-ai-translator-translator.php:102
|
||||
msgid "The target language is not installed on this site."
|
||||
msgstr "El idioma de destino no está instalado en este sitio."
|
||||
|
||||
#. translators: %s: target language name.
|
||||
#: includes/class-ai-translator-translator.php:157
|
||||
#: includes/class-ai-translator-translator.php:108
|
||||
#, php-format
|
||||
msgid ""
|
||||
"You are a professional translator. Translate the user message into %s. "
|
||||
"Preserve any HTML, shortcodes, line breaks, and Markdown exactly as they "
|
||||
"appear. Return only the translated text, without explanations, prefaces, or "
|
||||
"quotation marks."
|
||||
msgstr ""
|
||||
"Eres un traductor profesional. Traduce el mensaje del usuario al %s. "
|
||||
"Preserva el HTML, los shortcodes, los saltos de línea y el Markdown "
|
||||
"exactamente como aparecen. Devuelve solo el texto traducido, sin "
|
||||
"explicaciones, prefacios ni comillas."
|
||||
msgid "You are a professional translator. Translate the user message into %s. Preserve any HTML, shortcodes, line breaks, and Markdown exactly as they appear. Return only the translated text, without explanations, prefaces, or quotation marks."
|
||||
msgstr "Eres un traductor profesional. Traduce el mensaje del usuario al %s. Preserva el HTML, los shortcodes, los saltos de línea y el Markdown exactamente como aparecen. Devuelve solo el texto traducido, sin explicaciones, prefacios ni comillas."
|
||||
|
||||
#: includes/class-ai-translator-translator.php:186
|
||||
#: includes/class-ai-translator-translator.php:129
|
||||
msgid "The AI service returned an unexpected response."
|
||||
msgstr "El servicio de IA ha devuelto una respuesta inesperada."
|
||||
|
||||
#. translators: %s: Link to the WordPress AI settings page.
|
||||
#: robotstxt-ai-translator.php:145
|
||||
#, php-format
|
||||
msgid ""
|
||||
"AI Translator (by ROBOTSTXT) requires a configured AI provider for text "
|
||||
"generation. Open %s to set one up."
|
||||
msgstr ""
|
||||
"AI Translator (by ROBOTSTXT) requiere un proveedor de IA configurado para la "
|
||||
"generación de texto. Abre %s para configurar uno."
|
||||
#: class-robotstxt-updater.php:456
|
||||
msgid "You do not have sufficient permissions to access this page."
|
||||
msgstr "No tienes permisos suficientes para acceder a esta página."
|
||||
|
||||
#: robotstxt-ai-translator.php:146
|
||||
#. Plugin URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator"
|
||||
msgstr ""
|
||||
|
||||
#. Description of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "Translate post titles and content from the editor using the native WordPress AI client (available in WP 7.0+). Multisite-ready with global or per-site configuration."
|
||||
msgstr ""
|
||||
|
||||
#. Author URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://www.robotstxt.es/"
|
||||
msgstr ""
|
||||
|
||||
#: class-robotstxt-updater.php:452
|
||||
msgid "Security check failed."
|
||||
msgstr "Error de verificación de seguridad."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:228
|
||||
#: includes/class-ai-translator-admin.php:348
|
||||
#: includes/class-ai-translator-editor-ui.php:455
|
||||
msgid "Translate excerpt"
|
||||
msgstr "Traducir extracto"
|
||||
|
||||
#. translators: 1: title default, 2: content default, 3: excerpt default.
|
||||
#: includes/class-ai-translator-admin.php:236
|
||||
#, php-format
|
||||
msgid "Network defaults: title %1$s, content %2$s, excerpt %3$s."
|
||||
msgstr "Valores predeterminados de la red: título %1$s, contenido %2$s, extracto %3$s."
|
||||
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:253
|
||||
#: includes/class-ai-translator-admin.php:360
|
||||
#: includes/class-ai-translator-admin.php:363
|
||||
msgid "MultilingualPress"
|
||||
msgstr "MultilingualPress"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:257
|
||||
#: includes/class-ai-translator-admin.php:367
|
||||
msgid "Auto-translate new connected posts"
|
||||
msgstr "Traducir automáticamente las entradas conectadas nuevas"
|
||||
|
||||
#: includes/class-ai-translator-admin.php:261
|
||||
#: includes/class-ai-translator-admin.php:371
|
||||
msgid "When MultilingualPress creates a new connected post, automatically translate its enabled fields into the target site's language. The translation runs synchronously during save."
|
||||
msgstr "Cuando MultilingualPress crea una entrada conectada nueva, traduce automáticamente los campos activados al idioma del sitio de destino. La traducción se ejecuta de forma síncrona al guardar."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:145
|
||||
#: includes/class-ai-translator-editor-ui.php:319
|
||||
#: includes/class-ai-translator-editor-ui.php:451
|
||||
#: includes/class-ai-translator-translator.php:86
|
||||
msgid "AI features are disabled for this WordPress installation."
|
||||
msgstr "Las funciones de IA están desactivadas para esta instalación de WordPress."
|
||||
|
||||
#: includes/class-ai-translator-cli.php:149
|
||||
#: includes/class-ai-translator-translator.php:93
|
||||
msgid "No AI provider is configured for text generation. Open Settings → AI to set one up."
|
||||
msgstr "No hay ningún proveedor de IA configurado para la generación de texto. Abre Ajustes → IA para configurar uno."
|
||||
|
||||
#. translators: %s: Link to the WordPress AI settings page.
|
||||
#: robotstxt-ai-translator.php:144
|
||||
#, php-format
|
||||
msgid "AI Translator (by ROBOTSTXT) requires a configured AI provider for text generation. Open %s to set one up."
|
||||
msgstr "AI Translator (by ROBOTSTXT) requiere un proveedor de IA configurado para la generación de texto. Abre %s para configurar uno."
|
||||
|
||||
#: robotstxt-ai-translator.php:145
|
||||
msgid "Settings → AI"
|
||||
msgstr "Ajustes → IA"
|
||||
|
||||
#: includes/class-ai-translator-admin.php
|
||||
msgid "Request timeout"
|
||||
msgstr "Tiempo máximo de respuesta"
|
||||
|
||||
#: includes/class-ai-translator-admin.php
|
||||
msgid "seconds"
|
||||
msgstr "segundos"
|
||||
|
||||
#. translators: %d: PHP max_execution_time in seconds.
|
||||
#: includes/class-ai-translator-admin.php
|
||||
#, php-format
|
||||
msgid "Maximum time the server waits for an AI response. PHP max_execution_time is %d s — values above this have no effect."
|
||||
msgstr "Tiempo máximo que el servidor espera una respuesta de la IA. El max_execution_time de PHP es de %d s — los valores superiores no tienen efecto."
|
||||
|
||||
#: includes/class-ai-translator-admin.php
|
||||
msgid "Maximum time the server waits for an AI response. PHP max_execution_time is unlimited."
|
||||
msgstr "Tiempo máximo que el servidor espera una respuesta de la IA. El max_execution_time de PHP es ilimitado."
|
||||
|
||||
#. translators: 1: number of chunks translated so far, 2: total number of chunks.
|
||||
#: includes/class-ai-translator-editor-ui.php
|
||||
msgid "Translating… ({done}/{total})"
|
||||
msgstr "Traduciendo… ({done}/{total})"
|
||||
|
|
|
|||
|
|
@ -2,14 +2,14 @@
|
|||
# This file is distributed under the GPL-3.0-or-later.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: AI Translator (by ROBOTSTXT) 1.2.3\n"
|
||||
"Report-Msgid-Bugs-To: https://www.robotstxt.software/plugins/robotstxt-ai-translator/\n"
|
||||
"Project-Id-Version: AI Translator (by ROBOTSTXT) 1.2.0\n"
|
||||
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-ai-translator\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"POT-Creation-Date: 2026-08-24T11:03:38+00:00\n"
|
||||
"POT-Creation-Date: 2026-05-28T06:44:22+00:00\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"X-Generator: WP-CLI 2.12.0\n"
|
||||
"X-Domain: robotstxt-ai-translator\n"
|
||||
|
|
@ -21,7 +21,7 @@ msgstr ""
|
|||
|
||||
#. Plugin URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://www.robotstxt.software/plugins/robotstxt-ai-translator/"
|
||||
msgid "https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator"
|
||||
msgstr ""
|
||||
|
||||
#. Description of the plugin
|
||||
|
|
@ -36,265 +36,273 @@ msgstr ""
|
|||
|
||||
#. Author URI of the plugin
|
||||
#: robotstxt-ai-translator.php
|
||||
msgid "https://www.robotstxt.software/"
|
||||
msgid "https://www.robotstxt.es/"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:122
|
||||
#: includes/class-ai-translator-admin.php:123
|
||||
#: includes/class-ai-translator-admin.php:140
|
||||
#: includes/class-ai-translator-admin.php:141
|
||||
#: class-robotstxt-updater.php:452
|
||||
msgid "Security check failed."
|
||||
msgstr ""
|
||||
|
||||
#: class-robotstxt-updater.php:456
|
||||
msgid "You do not have sufficient permissions to access this page."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:112
|
||||
#: includes/class-ai-translator-admin.php:113
|
||||
#: includes/class-ai-translator-admin.php:130
|
||||
#: includes/class-ai-translator-admin.php:131
|
||||
#: includes/class-ai-translator-editor-ui.php:402
|
||||
#: includes/class-ai-translator-editor-ui.php:558
|
||||
msgid "AI Translator"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:163
|
||||
#: includes/class-ai-translator-admin.php:181
|
||||
#: includes/class-ai-translator-admin.php:153
|
||||
#: includes/class-ai-translator-admin.php:171
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:197
|
||||
#: includes/class-ai-translator-admin.php:333
|
||||
#: includes/class-ai-translator-admin.php:187
|
||||
#: includes/class-ai-translator-admin.php:321
|
||||
msgid "You do not have permission to access this page."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:206
|
||||
#: includes/class-ai-translator-admin.php:196
|
||||
msgid "AI Translator Settings"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:212
|
||||
#: includes/class-ai-translator-admin.php:200
|
||||
msgid "Settings saved."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:223
|
||||
#: includes/class-ai-translator-admin.php:226
|
||||
#: includes/class-ai-translator-admin.php:378
|
||||
#: includes/class-ai-translator-admin.php:382
|
||||
#: includes/class-ai-translator-admin.php:211
|
||||
#: includes/class-ai-translator-admin.php:214
|
||||
#: includes/class-ai-translator-admin.php:364
|
||||
#: includes/class-ai-translator-admin.php:368
|
||||
msgid "Translation fields"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:230
|
||||
#: includes/class-ai-translator-admin.php:386
|
||||
#: includes/class-ai-translator-admin.php:218
|
||||
#: includes/class-ai-translator-admin.php:372
|
||||
#: includes/class-ai-translator-editor-ui.php:565
|
||||
msgid "Translate title"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:235
|
||||
#: includes/class-ai-translator-admin.php:391
|
||||
#: includes/class-ai-translator-admin.php:223
|
||||
#: includes/class-ai-translator-admin.php:377
|
||||
#: includes/class-ai-translator-editor-ui.php:566
|
||||
msgid "Translate content"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:240
|
||||
#: includes/class-ai-translator-admin.php:396
|
||||
#: includes/class-ai-translator-admin.php:228
|
||||
#: includes/class-ai-translator-admin.php:382
|
||||
#: includes/class-ai-translator-editor-ui.php:567
|
||||
msgid "Translate excerpt"
|
||||
msgstr ""
|
||||
|
||||
#. translators: 1: title default, 2: content default, 3: excerpt default.
|
||||
#: includes/class-ai-translator-admin.php:248
|
||||
#: includes/class-ai-translator-admin.php:236
|
||||
#, php-format
|
||||
msgid "Network defaults: title %1$s, content %2$s, excerpt %3$s."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:249
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:251
|
||||
#: includes/class-ai-translator-admin.php:237
|
||||
#: includes/class-ai-translator-admin.php:238
|
||||
#: includes/class-ai-translator-admin.php:239
|
||||
msgid "enabled"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:249
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:251
|
||||
#: includes/class-ai-translator-admin.php:237
|
||||
#: includes/class-ai-translator-admin.php:238
|
||||
#: includes/class-ai-translator-admin.php:239
|
||||
msgid "disabled"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:262
|
||||
#: includes/class-ai-translator-admin.php:408
|
||||
#: includes/class-ai-translator-admin.php:250
|
||||
#: includes/class-ai-translator-admin.php:394
|
||||
msgid "Request timeout"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:275
|
||||
#: includes/class-ai-translator-admin.php:421
|
||||
#: includes/class-ai-translator-admin.php:263
|
||||
#: includes/class-ai-translator-admin.php:407
|
||||
msgid "seconds"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %d: PHP max_execution_time in seconds.
|
||||
#: includes/class-ai-translator-admin.php:283
|
||||
#: includes/class-ai-translator-admin.php:429
|
||||
#: includes/class-ai-translator-admin.php:271
|
||||
#: includes/class-ai-translator-admin.php:415
|
||||
#, php-format
|
||||
msgid "Maximum time the server waits for an AI response. PHP max_execution_time is %d s — values above this have no effect."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:287
|
||||
#: includes/class-ai-translator-admin.php:433
|
||||
#: includes/class-ai-translator-admin.php:275
|
||||
#: includes/class-ai-translator-admin.php:419
|
||||
msgid "Maximum time the server waits for an AI response. PHP max_execution_time is unlimited."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:296
|
||||
#: includes/class-ai-translator-admin.php:299
|
||||
#: includes/class-ai-translator-admin.php:442
|
||||
#: includes/class-ai-translator-admin.php:445
|
||||
#: includes/class-ai-translator-admin.php:284
|
||||
#: includes/class-ai-translator-admin.php:287
|
||||
#: includes/class-ai-translator-admin.php:428
|
||||
#: includes/class-ai-translator-admin.php:431
|
||||
msgid "MultilingualPress"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:303
|
||||
#: includes/class-ai-translator-admin.php:449
|
||||
#: includes/class-ai-translator-admin.php:291
|
||||
#: includes/class-ai-translator-admin.php:435
|
||||
msgid "Auto-translate new connected posts"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:307
|
||||
#: includes/class-ai-translator-admin.php:453
|
||||
#: includes/class-ai-translator-admin.php:295
|
||||
#: includes/class-ai-translator-admin.php:439
|
||||
msgid "When MultilingualPress creates a new connected post, automatically translate its enabled fields into the target site's language. The translation runs synchronously during save."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:342
|
||||
#: includes/class-ai-translator-admin.php:330
|
||||
msgid "AI Translator Network Settings"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:348
|
||||
#: includes/class-ai-translator-admin.php:334
|
||||
msgid "Network settings saved."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:358
|
||||
#: includes/class-ai-translator-admin.php:361
|
||||
#: includes/class-ai-translator-admin.php:344
|
||||
#: includes/class-ai-translator-admin.php:347
|
||||
msgid "Configuration mode"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:365
|
||||
#: includes/class-ai-translator-admin.php:351
|
||||
msgid "Global configuration: a single setting applies to every site."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:370
|
||||
#: includes/class-ai-translator-admin.php:356
|
||||
msgid "Per-site configuration: each site can override these defaults."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:400
|
||||
#: includes/class-ai-translator-admin.php:386
|
||||
msgid "In global mode this is the configuration for the whole network. In per-site mode these values are used as defaults for sites that have not been configured individually."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:479
|
||||
#: includes/class-ai-translator-admin.php:511
|
||||
#: includes/class-ai-translator-admin.php:465
|
||||
#: includes/class-ai-translator-admin.php:497
|
||||
msgid "You do not have permission to perform this action."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:555
|
||||
#: includes/class-ai-translator-admin.php:541
|
||||
msgid "Recommended models"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:558
|
||||
#: includes/class-ai-translator-admin.php:544
|
||||
msgid "This plugin does not call AI providers directly. Configure your preferred provider in the WordPress AI plugin settings. The table below is a guide to help you pick a model based on your translation use case."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:564
|
||||
#: includes/class-ai-translator-admin.php:550
|
||||
msgid "Use case"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:565
|
||||
#: includes/class-ai-translator-admin.php:551
|
||||
msgid "Recommended model"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:566
|
||||
#: includes/class-ai-translator-admin.php:552
|
||||
msgid "Why"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:581
|
||||
#: includes/class-ai-translator-admin.php:567
|
||||
msgid "These recommendations are based on public benchmarks and community feedback as of the plugin release date. They may change as providers update their models."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:596
|
||||
#: includes/class-ai-translator-admin.php:582
|
||||
msgid "European languages (ES, CA, FR, DE, IT, PT)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:597
|
||||
#: includes/class-ai-translator-admin.php:583
|
||||
msgid "DeepL API Pro"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:598
|
||||
#: includes/class-ai-translator-admin.php:584
|
||||
msgid "Best fluency and naturalness (92/100 in benchmarks). Formality control and custom glossaries."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:601
|
||||
#: includes/class-ai-translator-admin.php:587
|
||||
msgid "Asian languages (ZH, JA, KO)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:602
|
||||
#: includes/class-ai-translator-admin.php:588
|
||||
msgid "GPT-4o / GPT-5 or Claude Sonnet 4"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:603
|
||||
#: includes/class-ai-translator-admin.php:589
|
||||
msgid "Better handling of implicit subjects, honorifics, and cultural references. DeepL falls behind here."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:606
|
||||
#: includes/class-ai-translator-admin.php:592
|
||||
msgid "Marketing / brand tone"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:607
|
||||
#: includes/class-ai-translator-admin.php:593
|
||||
msgid "Claude Sonnet 4 / Opus 4"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:608
|
||||
#: includes/class-ai-translator-admin.php:594
|
||||
msgid "Better preservation of tone, brand voice, and nuance. Ideal for creative copy."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:611
|
||||
#: includes/class-ai-translator-admin.php:597
|
||||
msgid "Technical documentation / code"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:612
|
||||
#: includes/class-ai-translator-admin.php:598
|
||||
msgid "GPT-4o / GPT-5"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:613
|
||||
#: includes/class-ai-translator-admin.php:599
|
||||
msgid "Higher accuracy with variables, structured formats, and technical terminology."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:616
|
||||
#: includes/class-ai-translator-admin.php:602
|
||||
msgid "Long documents (100+ pages)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:617
|
||||
#: includes/class-ai-translator-admin.php:603
|
||||
msgid "Gemini 2.5 Pro"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:618
|
||||
#: includes/class-ai-translator-admin.php:604
|
||||
msgid "1M token context window. Maintains terminological consistency across long texts."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:621
|
||||
#: includes/class-ai-translator-admin.php:607
|
||||
msgid "High volume / low cost"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:622
|
||||
#: includes/class-ai-translator-admin.php:608
|
||||
msgid "DeepSeek-V3"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:623
|
||||
#: includes/class-ai-translator-admin.php:609
|
||||
msgid "Quality comparable to GPT-5 at ~$0.14/M tokens (20-50x cheaper than Claude/GPT)."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:626
|
||||
#: includes/class-ai-translator-admin.php:612
|
||||
msgid "Rare / indigenous languages"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:627
|
||||
#: includes/class-ai-translator-admin.php:613
|
||||
msgid "Claude Sonnet or Taskade Translate (multi-model routing)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:628
|
||||
#: includes/class-ai-translator-admin.php:614
|
||||
msgid "Better coverage for uncommon language pairs."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:631
|
||||
#: includes/class-ai-translator-admin.php:617
|
||||
msgid "Maximum coverage (133+ languages)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:632
|
||||
#: includes/class-ai-translator-admin.php:618
|
||||
msgid "Google Cloud Translation"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-admin.php:633
|
||||
#: includes/class-ai-translator-admin.php:619
|
||||
msgid "The most complete option, though with slightly lower quality on European languages."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -405,20 +413,6 @@ msgstr ""
|
|||
msgid "You have unsaved changes. Save the post before translating to ensure the latest content is used."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:162
|
||||
#: includes/class-ai-translator-manager-notice.php:185
|
||||
msgid "To get updates for the ROBOTSTXT plugins, the plugin below must be installed and active:"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:164
|
||||
#: includes/class-ai-translator-manager-notice.php:187
|
||||
msgid "Manager (by ROBOTSTXT)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-manager-notice.php:166
|
||||
msgid "Dismiss this notice"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-ai-translator-translator.php:151
|
||||
msgid "The target language is not installed on this site."
|
||||
msgstr ""
|
||||
|
|
@ -434,11 +428,11 @@ msgid "The AI service returned an unexpected response."
|
|||
msgstr ""
|
||||
|
||||
#. translators: %s: Link to the WordPress AI settings page.
|
||||
#: robotstxt-ai-translator.php:145
|
||||
#: robotstxt-ai-translator.php:144
|
||||
#, php-format
|
||||
msgid "AI Translator (by ROBOTSTXT) requires a configured AI provider for text generation. Open %s to set one up."
|
||||
msgstr ""
|
||||
|
||||
#: robotstxt-ai-translator.php:146
|
||||
#: robotstxt-ai-translator.php:145
|
||||
msgid "Settings → AI"
|
||||
msgstr ""
|
||||
|
|
|
|||
42
readme.txt
42
readme.txt
|
|
@ -3,8 +3,8 @@ Contributors: robotstxt, javiercasares
|
|||
Tags: ai, translation, multilingual, multisite, editor
|
||||
Requires at least: 7.0
|
||||
Tested up to: 7.1
|
||||
Requires PHP: 5.6
|
||||
Stable tag: 1.2.3
|
||||
Requires PHP: 7.4
|
||||
Stable tag: 1.2.1
|
||||
License: GPL-3.0-or-later
|
||||
License URI: https://www.gnu.org/licenses/gpl-3.0.txt
|
||||
|
||||
|
|
@ -109,7 +109,7 @@ The endpoint reads the **saved** title and content from the database, not from t
|
|||
= Requirements =
|
||||
|
||||
* WordPress 7.0 or higher (the `wp_ai_client_prompt()` function is part of WordPress core since 7.0).
|
||||
* PHP 5.6 or higher.
|
||||
* PHP 7.4 or higher.
|
||||
* At least one AI provider configured in Settings → AI. The plugin works with any provider registered through the WordPress AI client — no specific AI plugin is required.
|
||||
|
||||
= Manual download =
|
||||
|
|
@ -135,31 +135,37 @@ The plugin reads the post title and content from the database, not from the edit
|
|||
== Compatibility ==
|
||||
|
||||
* WordPress: 7.0 - 7.1
|
||||
* PHP: 5.6 - 8.5
|
||||
* PHP: 7.4 - 8.5
|
||||
* WP-CLI: 2.12 or newer
|
||||
|
||||
== Changelog ==
|
||||
|
||||
Only the 3 last versions. The full changelog will be at changelog.txt
|
||||
|
||||
= 1.2.3 =
|
||||
|
||||
* Manager (by ROBOTSTXT) detection now uses the ecosystem presence constant `ROBOTSTXT_MANAGER_NOTICED` (Manager 1.6.2+) instead of scanning the plugin list, falling back to the plugin-list scan for older Manager versions.
|
||||
|
||||
= 1.2.2 =
|
||||
|
||||
* Added a dismissible admin notice on the Plugins list screens recommending Manager (by ROBOTSTXT) when it is not installed and active, plus a persistent warning on the plugin settings pages. Updates for the ROBOTSTXT plugins are delivered through Manager.
|
||||
* Removed the bundled JSON updater (`class-robotstxt-updater.php` and `update.json`). Plugin updates are now handled by Manager.
|
||||
* Changed the Plugin URI and Update URI to `https://www.robotstxt.software/plugins/robotstxt-ai-translator/`.
|
||||
* Lowered the minimum PHP version from 7.4 to 5.6 (verified with PHPCompatibility 5.6-8.5). WordPress 7.0+ remains the minimum WordPress version because the plugin uses the native WordPress AI client.
|
||||
|
||||
= 1.2.1 =
|
||||
|
||||
* Confirmed compatibility with WordPress 7.1. No functional changes.
|
||||
|
||||
= 1.2.0 =
|
||||
|
||||
* Added configurable "Request timeout" setting (default 60 s, minimum 30 s, maximum 300 s) in site and network admin pages.
|
||||
* Added parallel chunked content translation: long posts are split at Gutenberg block or paragraph boundaries and all chunks are sent to the AI concurrently, eliminating timeout errors on lengthy content.
|
||||
* Added real-time progress indicator on the Translate button: "Translating… (2/5)" as each chunk resolves.
|
||||
* Added new REST endpoint `POST /wp-json/ai-translator/v1/translate-text` for raw-text translation; used internally by the chunked content path.
|
||||
* Changed: content translation now reads from the current editor state (unsaved changes included); title and excerpt continue to read from the saved post.
|
||||
|
||||
= 1.1.0 =
|
||||
|
||||
* Added excerpt field (`post_excerpt`) as a translatable field, with a dedicated settings toggle.
|
||||
* Added MultilingualPress integration: when MLP creates a new connected post, the plugin automatically translates the enabled fields into the target site's language (opt-in, disabled by default).
|
||||
* Removed `Requires Plugins: ai` header — `wp_ai_client_prompt()` is a native WordPress 7.0 function; the plugin now works with any AI provider configured through WordPress core.
|
||||
* Admin notice now shows when no AI provider is configured for text generation (instead of checking for a function that always exists in WP 7.0+).
|
||||
|
||||
= 1.0.0 =
|
||||
|
||||
* Initial release. Translation panel for block and classic editors, REST endpoint, WP-CLI command, single-site and Multisite (global / per-site) configuration modes.
|
||||
|
||||
= Previous versions =
|
||||
|
||||
If you want to see the full changelog, visit the [changelog](https://www.robotstxt.software/plugins/robotstxt-ai-translator/) page.
|
||||
If you want to see the full changelog, visit the [changelog.txt](https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator/raw/branch/main/changelog.txt) file.
|
||||
|
||||
== Compliance ==
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Plugin Name: AI Translator (by ROBOTSTXT)
|
||||
* Plugin URI: https://www.robotstxt.software/plugins/robotstxt-ai-translator/
|
||||
* Update URI: https://www.robotstxt.software/plugins/robotstxt-ai-translator/
|
||||
* Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator
|
||||
* Gitea Plugin URI: ROBOTSTXT/robotstxt-ai-translator
|
||||
* Description: Translate post titles and content from the editor using the native WordPress AI client (available in WP 7.0+). Multisite-ready with global or per-site configuration.
|
||||
* Version: 1.2.3
|
||||
* Version: 1.2.1
|
||||
* Author: ROBOTSTXT
|
||||
* Author URI: https://www.robotstxt.software/
|
||||
* Author URI: https://www.robotstxt.es/
|
||||
* License: GPL-3.0-or-later
|
||||
* License URI: https://www.gnu.org/licenses/gpl-3.0.txt
|
||||
* Text Domain: robotstxt-ai-translator
|
||||
* Domain Path: /languages
|
||||
* Requires at least: 7.0
|
||||
* Requires PHP: 5.6
|
||||
* Requires PHP: 7.4
|
||||
* Network: true
|
||||
*
|
||||
* @package ROBOTSTXT\AI_Translator
|
||||
|
|
@ -25,7 +25,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
/**
|
||||
* Plugin version.
|
||||
*/
|
||||
define( 'AI_TRANSLATOR_VERSION', '1.2.3' );
|
||||
define( 'AI_TRANSLATOR_VERSION', '1.2.1' );
|
||||
|
||||
/**
|
||||
* Main plugin file path.
|
||||
|
|
@ -56,7 +56,7 @@ require_once AI_TRANSLATOR_DIR . 'includes/class-ai-translator-settings.php';
|
|||
require_once AI_TRANSLATOR_DIR . 'includes/class-ai-translator-translator.php';
|
||||
require_once AI_TRANSLATOR_DIR . 'includes/class-ai-translator-admin.php';
|
||||
require_once AI_TRANSLATOR_DIR . 'includes/class-ai-translator-editor-ui.php';
|
||||
require_once AI_TRANSLATOR_DIR . 'includes/class-ai-translator-manager-notice.php';
|
||||
require_once AI_TRANSLATOR_DIR . 'class-robotstxt-updater.php';
|
||||
|
||||
if ( class_exists( '\Inpsyde\MultilingualPress\TranslationUi\Post\MetaboxAction' ) ) {
|
||||
require_once AI_TRANSLATOR_DIR . 'includes/class-ai-translator-mlp-integration.php';
|
||||
|
|
@ -95,8 +95,7 @@ add_action( 'init', 'ai_translator_load_textdomain' );
|
|||
function ai_translator_bootstrap() {
|
||||
$settings = new AI_Translator_Settings();
|
||||
$translator = new AI_Translator_Translator( $settings );
|
||||
$manager_notice = new AI_Translator_Manager_Notice();
|
||||
$admin = new AI_Translator_Admin( $settings, $manager_notice );
|
||||
$admin = new AI_Translator_Admin( $settings );
|
||||
$editor_ui = new AI_Translator_Editor_UI( $settings, $translator );
|
||||
|
||||
$admin->register();
|
||||
|
|
@ -112,7 +111,7 @@ function ai_translator_bootstrap() {
|
|||
$mlp->register();
|
||||
}
|
||||
|
||||
$manager_notice->register();
|
||||
Robotstxt_Updater::init( AI_TRANSLATOR_FILE );
|
||||
}
|
||||
add_action( 'plugins_loaded', 'ai_translator_bootstrap' );
|
||||
|
||||
|
|
|
|||
27
update.json
Normal file
27
update.json
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"name": "AI Translator (by ROBOTSTXT)",
|
||||
"slug": "robotstxt-ai-translator",
|
||||
"version": "1.2.1",
|
||||
"download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator/releases/download/1.2.1/robotstxt-ai-translator-1.2.1.zip",
|
||||
"requires": "7.0",
|
||||
"requires_php": "7.4",
|
||||
"tested": "7.1",
|
||||
"last_updated": "2026-08-07",
|
||||
"author": "ROBOTSTXT",
|
||||
"author_profile": "https://www.robotstxt.es/",
|
||||
"homepage": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-ai-translator",
|
||||
"description": "Translate post titles and content from the WordPress editor using the native WordPress AI client (available in WP 7.0+). Multisite-ready with global or per-site configuration.",
|
||||
"changelog": "<h3>1.2.1 - 2026-08-07</h3><ul><li><strong>Changed:</strong> Confirmed compatibility with WordPress 7.1. No functional changes.</li></ul><h3>1.2.0 - 2026-05-26</h3><ul><li><strong>Added:</strong> Configurable request timeout — new \"Request timeout\" setting (default 60 s, min 30 s, max 300 s) controls how long the server waits for an AI response before timing out.</li><li><strong>Added:</strong> Parallel chunked content translation — long post content is automatically split at block (Gutenberg) or paragraph (Classic editor) boundaries and translated in parallel, eliminating timeout errors on lengthy posts.</li><li><strong>Added:</strong> Progress indicator — the Translate button shows \"Translating… (2/5)\" while chunks are in flight.</li><li><strong>Added:</strong> New REST endpoint POST /wp-json/ai-translator/v1/translate-text for raw-text translation; used internally by the chunked content path.</li></ul><h3>1.1.0 - 2026-05-25</h3><ul><li><strong>Added:</strong> Excerpt translation — post_excerpt is now a translatable field with its own settings toggle.</li><li><strong>Added:</strong> MultilingualPress integration — auto-translate new connected posts at creation time (opt-in).</li><li><strong>Changed:</strong> Removed Requires Plugins: ai header — wp_ai_client_prompt() is native to WordPress 7.0; works with any configured AI provider.</li><li><strong>Changed:</strong> Admin notice now fires when no text-generation provider is configured.</li></ul><h3>1.0.0 - 2026-05-23</h3><ul><li><strong>Added:</strong> Block editor sidebar and Classic editor metabox with language selector and Translate button.</li><li><strong>Added:</strong> REST endpoint POST /wp-json/ai-translator/v1/translate.</li><li><strong>Added:</strong> WP-CLI command wp ai-translator translate for single-post and bulk translation.</li><li><strong>Added:</strong> Network admin settings page with global / per-site configuration mode.</li><li><strong>Added:</strong> Site admin settings page with title and content translation toggles.</li><li><strong>Added:</strong> Model recommendations table in the settings pages.</li></ul>",
|
||||
"sections": {
|
||||
"description": "Translate post titles and content from the WordPress editor using the native WordPress AI client (available in WP 7.0+). Multisite-ready with global or per-site configuration.",
|
||||
"changelog": "<h3>1.2.1 - 2026-08-07</h3><ul><li><strong>Changed:</strong> Confirmed compatibility with WordPress 7.1. No functional changes.</li></ul><h3>1.2.0 - 2026-05-26</h3><ul><li><strong>Added:</strong> Configurable request timeout — new \"Request timeout\" setting (default 60 s, min 30 s, max 300 s) controls how long the server waits for an AI response before timing out.</li><li><strong>Added:</strong> Parallel chunked content translation — long post content is automatically split at block (Gutenberg) or paragraph (Classic editor) boundaries and translated in parallel, eliminating timeout errors on lengthy posts.</li><li><strong>Added:</strong> Progress indicator — the Translate button shows \"Translating… (2/5)\" while chunks are in flight.</li><li><strong>Added:</strong> New REST endpoint POST /wp-json/ai-translator/v1/translate-text for raw-text translation; used internally by the chunked content path.</li></ul><h3>1.1.0 - 2026-05-25</h3><ul><li><strong>Added:</strong> Excerpt translation — post_excerpt is now a translatable field with its own settings toggle.</li><li><strong>Added:</strong> MultilingualPress integration — auto-translate new connected posts at creation time (opt-in).</li><li><strong>Changed:</strong> Removed Requires Plugins: ai header — wp_ai_client_prompt() is native to WordPress 7.0; works with any configured AI provider.</li><li><strong>Changed:</strong> Admin notice now fires when no text-generation provider is configured.</li></ul><h3>1.0.0 - 2026-05-23</h3><ul><li><strong>Added:</strong> Block editor sidebar and Classic editor metabox with language selector and Translate button.</li><li><strong>Added:</strong> REST endpoint POST /wp-json/ai-translator/v1/translate.</li><li><strong>Added:</strong> WP-CLI command wp ai-translator translate for single-post and bulk translation.</li><li><strong>Added:</strong> Network admin settings page with global / per-site configuration mode.</li><li><strong>Added:</strong> Site admin settings page with title and content translation toggles.</li><li><strong>Added:</strong> Model recommendations table in the settings pages.</li></ul>"
|
||||
},
|
||||
"banners": {
|
||||
"low": "",
|
||||
"high": ""
|
||||
},
|
||||
"icons": {
|
||||
"1x": "",
|
||||
"2x": ""
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue