首页 / 应用软件 / 手把手教学,为WordPress网站添加多语言翻译工具

手把手教学,为WordPress网站添加多语言翻译工具

手把手教学:为WordPress网站添加多语言翻译工具,通过WordPress程序的代码二次开发实现常用互联网小工具功能

引言:全球化时代的多语言网站需求

在当今互联网全球化时代,网站访问者来自世界各地,使用不同的语言。根据统计,超过75%的互联网用户更倾向于使用母语浏览网站内容,而超过50%的用户表示,如果网站没有他们熟悉的语言版本,他们会立即离开。对于WordPress网站所有者来说,提供多语言支持不再是奢侈选项,而是提升用户体验、扩大受众范围、增加转化率的必要手段。

传统的多语言解决方案如WPML、Polylang等插件虽然功能强大,但往往价格昂贵、系统臃肿,且不一定完全符合每个网站的特定需求。通过WordPress代码二次开发,我们可以创建轻量级、高度定制化的多语言翻译工具,同时整合其他实用的小工具功能,打造一个既高效又符合网站特色的多语言解决方案。

本文将手把手指导您如何通过WordPress代码二次开发,为网站添加多语言翻译功能,并在此过程中实现一些常用的互联网小工具,让您的网站在国际化的同时,功能也更加丰富完善。

第一部分:多语言翻译工具的设计与规划

1.1 确定多语言实现策略

在开始编码之前,我们需要确定多语言实现的基本策略。主要有以下几种方案:

  1. 子目录结构:如example.com/en/、example.com/es/
  2. 子域名结构:如en.example.com、es.example.com
  3. 不同顶级域名:如example.com、example.es
  4. 参数结构:如example.com?lang=en

对于大多数中小型网站,子目录结构是最简单且SEO友好的选择。我们将采用这种方案,通过WordPress的重写规则来实现。

1.2 功能需求分析

我们的多语言翻译工具需要具备以下核心功能:

  1. 语言切换器(前端显示)
  2. 内容翻译管理后台
  3. 自动检测用户浏览器语言
  4. SEO优化(hreflang标签等)
  5. 翻译字符串管理
  6. 语言特定的URL重写

同时,我们将整合以下常用小工具:

  • 社交分享按钮
  • 阅读进度指示器
  • 回到顶部按钮
  • 夜间模式切换

1.3 技术架构设计

我们将创建一个自定义插件来实现所有功能,这样即使更换主题,功能也能保持完整。插件结构如下:

multilingual-tools/
├── multilingual-tools.php          # 主插件文件
├── includes/
│   ├── class-language-switcher.php # 语言切换器
│   ├── class-translation-manager.php # 翻译管理器
│   ├── class-url-rewriter.php     # URL重写器
│   └── class-utilities.php        # 实用小工具
├── admin/
│   ├── css/
│   ├── js/
│   └── admin-pages.php            # 管理页面
├── public/
│   ├── css/
│   ├── js/
│   └── frontend-display.php       # 前端显示
└── languages/                     # 语言文件

第二部分:创建基础插件结构

2.1 初始化插件

首先,在wp-content/plugins/目录下创建multilingual-tools文件夹,然后创建主插件文件:

<?php
/**
 * Plugin Name: 多语言翻译工具
 * Plugin URI:  https://yourwebsite.com/
 * Description: 为WordPress网站添加多语言支持和实用小工具
 * Version:     1.0.0
 * Author:      您的名称
 * License:     GPL v2 or later
 * Text Domain: multilingual-tools
 * Domain Path: /languages
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('MLT_VERSION', '1.0.0');
define('MLT_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('MLT_PLUGIN_URL', plugin_dir_url(__FILE__));

// 自动加载类文件
spl_autoload_register(function ($class_name) {
    $prefix = 'MLT_';
    $base_dir = MLT_PLUGIN_DIR . 'includes/';
    
    $len = strlen($prefix);
    if (strncmp($prefix, $class_name, $len) !== 0) {
        return;
    }
    
    $relative_class = substr($class_name, $len);
    $file = $base_dir . 'class-' . str_replace('_', '-', strtolower($relative_class)) . '.php';
    
    if (file_exists($file)) {
        require $file;
    }
});

// 初始化插件
function mlt_init() {
    // 检查必要条件
    if (!function_exists('register_rest_route')) {
        add_action('admin_notices', function() {
            echo '<div class="notice notice-error"><p>多语言工具需要WordPress 4.7或更高版本。</p></div>';
        });
        return;
    }
    
    // 加载文本域
    load_plugin_textdomain('multilingual-tools', false, dirname(plugin_basename(__FILE__)) . '/languages');
    
    // 初始化各个组件
    if (is_admin()) {
        new MLT_Admin_Pages();
    } else {
        new MLT_Frontend_Display();
    }
    
    new MLT_Language_Switcher();
    new MLT_Translation_Manager();
    new MLT_URL_Rewriter();
    new MLT_Utilities();
}
add_action('plugins_loaded', 'mlt_init');

// 激活/停用钩子
register_activation_hook(__FILE__, 'mlt_activate');
register_deactivation_hook(__FILE__, 'mlt_deactivate');

function mlt_activate() {
    // 创建必要的数据库表
    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate();
    
    $table_name = $wpdb->prefix . 'mlt_translations';
    
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        original_text text NOT NULL,
        translated_text text NOT NULL,
        language_code varchar(10) NOT NULL,
        context varchar(100) DEFAULT '',
        type varchar(50) DEFAULT 'string',
        post_id bigint(20) DEFAULT 0,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        KEY language_code (language_code),
        KEY type_post_id (type, post_id)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
    
    // 添加默认选项
    add_option('mlt_settings', array(
        'enabled_languages' => array('en', 'zh'),
        'default_language' => 'en',
        'auto_detect' => true,
        'show_flags' => true,
        'hreflang' => true,
        'utilities' => array(
            'social_share' => true,
            'reading_progress' => true,
            'back_to_top' => true,
            'dark_mode' => false
        )
    ));
    
    // 刷新重写规则
    flush_rewrite_rules();
}

function mlt_deactivate() {
    // 清理临时数据
    flush_rewrite_rules();
}

2.2 创建语言切换器类

在includes目录下创建class-language-switcher.php:

<?php
class MLT_Language_Switcher {
    
    private $settings;
    private $current_language;
    private $available_languages;
    
    public function __construct() {
        $this->settings = get_option('mlt_settings', array());
        $this->available_languages = $this->settings['enabled_languages'] ?? array('en');
        $this->current_language = $this->get_current_language();
        
        $this->init_hooks();
    }
    
    private function init_hooks() {
        // 添加语言切换器到菜单
        add_filter('wp_nav_menu_items', array($this, 'add_language_switcher_to_menu'), 10, 2);
        
        // 短代码支持
        add_shortcode('language_switcher', array($this, 'language_switcher_shortcode'));
        
        // 小工具支持
        add_action('widgets_init', array($this, 'register_widget'));
        
        // AJAX语言切换
        add_action('wp_ajax_mlt_switch_language', array($this, 'ajax_switch_language'));
        add_action('wp_ajax_nopriv_mlt_switch_language', array($this, 'ajax_switch_language'));
    }
    
    public function get_current_language() {
        // 从URL参数获取
        if (isset($_GET['lang']) && in_array($_GET['lang'], $this->available_languages)) {
            setcookie('mlt_language', $_GET['lang'], time() + YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
            return $_GET['lang'];
        }
        
        // 从Cookie获取
        if (isset($_COOKIE['mlt_language']) && in_array($_COOKIE['mlt_language'], $this->available_languages)) {
            return $_COOKIE['mlt_language'];
        }
        
        // 自动检测浏览器语言
        if ($this->settings['auto_detect'] ?? true) {
            $browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
            if (in_array($browser_lang, $this->available_languages)) {
                return $browser_lang;
            }
        }
        
        // 返回默认语言
        return $this->settings['default_language'] ?? 'en';
    }
    
    public function add_language_switcher_to_menu($items, $args) {
        if ($args->theme_location == 'primary' || apply_filters('mlt_show_in_menu', false)) {
            $switcher = $this->render_switcher();
            $items .= '<li class="menu-item menu-item-language-switcher">' . $switcher . '</li>';
        }
        return $items;
    }
    
    public function language_switcher_shortcode($atts) {
        $atts = shortcode_atts(array(
            'type' => 'dropdown',
            'show_flags' => true,
            'show_names' => true
        ), $atts, 'language_switcher');
        
        return $this->render_switcher($atts['type'], $atts['show_flags'], $atts['show_names']);
    }
    
    private function render_switcher($type = 'dropdown', $show_flags = true, $show_names = true) {
        $languages = $this->get_language_data();
        $current_lang = $this->current_language;
        
        ob_start();
        
        if ($type === 'dropdown') {
            ?>
            <div class="mlt-language-switcher mlt-dropdown">
                <button class="mlt-switcher-toggle">
                    <?php if ($show_flags): ?>
                        <span class="mlt-flag mlt-flag-<?php echo esc_attr($current_lang); ?>"></span>
                    <?php endif; ?>
                    <?php if ($show_names): ?>
                        <span class="mlt-language-name"><?php echo esc_html($languages[$current_lang]['name']); ?></span>
                    <?php endif; ?>
                    <span class="mlt-arrow">▼</span>
                </button>
                <ul class="mlt-dropdown-menu">
                    <?php foreach ($languages as $code => $language): ?>
                        <?php if ($code !== $current_lang): ?>
                            <li>
                                <a href="<?php echo esc_url($this->get_language_url($code)); ?>" 
                                   class="mlt-language-link"
                                   data-lang="<?php echo esc_attr($code); ?>">
                                    <?php if ($show_flags): ?>
                                        <span class="mlt-flag mlt-flag-<?php echo esc_attr($code); ?>"></span>
                                    <?php endif; ?>
                                    <?php if ($show_names): ?>
                                        <span class="mlt-language-name"><?php echo esc_html($language['name']); ?></span>
                                    <?php endif; ?>
                                </a>
                            </li>
                        <?php endif; ?>
                    <?php endforeach; ?>
                </ul>
            </div>
            <?php
        } else {
            ?>
            <div class="mlt-language-switcher mlt-list">
                <?php foreach ($languages as $code => $language): ?>
                    <a href="<?php echo esc_url($this->get_language_url($code)); ?>" 
                       class="mlt-language-link <?php echo $code === $current_lang ? 'mlt-current' : ''; ?>"
                       data-lang="<?php echo esc_attr($code); ?>">
                        <?php if ($show_flags): ?>
                            <span class="mlt-flag mlt-flag-<?php echo esc_attr($code); ?>"></span>
                        <?php endif; ?>
                        <?php if ($show_names): ?>
                            <span class="mlt-language-name"><?php echo esc_html($language['name']); ?></span>
                        <?php endif; ?>
                    </a>
                <?php endforeach; ?>
            </div>
            <?php
        }
        
        return ob_get_clean();
    }
    
    private function get_language_data() {
        $languages = array(
            'en' => array('name' => 'English', 'native_name' => 'English', 'flag' => 'us'),
            'zh' => array('name' => '中文', 'native_name' => '简体中文', 'flag' => 'cn'),
            'es' => array('name' => 'Español', 'native_name' => 'Español', 'flag' => 'es'),
            'fr' => array('name' => 'Français', 'native_name' => 'Français', 'flag' => 'fr'),
            'de' => array('name' => 'Deutsch', 'native_name' => 'Deutsch', 'flag' => 'de'),
            'ja' => array('name' => '日本語', 'native_name' => '日本語', 'flag' => 'jp'),
            'ko' => array('name' => '한국어', 'native_name' => '한국어', 'flag' => 'kr'),
            'ru' => array('name' => 'Русский', 'native_name' => 'Русский', 'flag' => 'ru')
        );
        
        // 只返回启用的语言
        $enabled_languages = $this->available_languages;
        return array_intersect_key($languages, array_flip($enabled_languages));
    }
    
    private function get_language_url($language_code) {
        global $wp;
        $current_url = home_url($wp->request);
        
        // 如果是默认语言,移除语言参数
        if ($language_code === ($this->settings['default_language'] ?? 'en')) {
            return remove_query_arg('lang', $current_url);
        }
        
        // 添加语言参数
        return add_query_arg('lang', $language_code, $current_url);
    }
    
    public function ajax_switch_language() {
        if (!isset($_POST['language']) || !in_array($_POST['language'], $this->available_languages)) {
            wp_die('Invalid language');
        }
        
        $language = sanitize_text_field($_POST['language']);
        setcookie('mlt_language', $language, time() + YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
        
        wp_send_json_success(array(
            'redirect' => $this->get_language_url($language)
        ));
    }
    
    public function register_widget() {
        register_widget('MLT_Language_Switcher_Widget');
    }
}

// 语言切换器小工具
class MLT_Language_Switcher_Widget extends WP_Widget {
    
    public function __construct() {
        parent::__construct(
            'mlt_language_switcher',
            __('Language Switcher', 'multilingual-tools'),
            array('description' => __('Display a language switcher', 'multilingual-tools'))
        );
    }
    
    public function widget($args, $instance) {
        echo $args['before_widget'];
        
        if (!empty($instance['title'])) {
            echo $args['before_title'] . apply_filters('widget_title', $instance['title']) . $args['after_title'];
        }
        
        $switcher = new MLT_Language_Switcher();
        echo $switcher->language_switcher_shortcode(array(
            'type' => $instance['type'] ?? 'list',
            'show_flags' => !empty($instance['show_flags']),
            'show_names' => !empty($instance['show_names'])
        ));
        
        echo $args['after_widget'];
    }
    
    public function form($instance) {
        $title = $instance['title'] ?? __('Languages', 'multilingual-tools');
        $type = $instance['type'] ?? 'list';
        $show_flags = isset($instance['show_flags']) ? (bool) $instance['show_flags'] : true;
        $show_names = isset($instance['show_names']) ? (bool) $instance['show_names'] : true;
        ?>
        <p>
            <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
            <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" 
                   name="<?php echo $this->get_field_name('title'); ?>" type="text" 
                   value="<?php echo esc_attr($title); ?>">
        </p>
        <p>
            <label for="<?php echo $this->get_field_id('type'); ?>"><?php _e('Display type:'); ?></label>
            <select class="widefat" id="<?php echo $this->get_field_id('type'); ?>" 
                    name="<?php echo $this->get_field_name('type'); ?>">

2.3 创建翻译管理器类

在includes目录下创建class-translation-manager.php:

<?php
class MLT_Translation_Manager {
    
    private $table_name;
    private $current_language;
    
    public function __construct() {
        global $wpdb;
        $this->table_name = $wpdb->prefix . 'mlt_translations';
        $this->current_language = $this->get_current_language();
        
        $this->init_hooks();
    }
    
    private function init_hooks() {
        // 翻译字符串
        add_filter('gettext', array($this, 'translate_text'), 10, 3);
        add_filter('ngettext', array($this, 'translate_plural'), 10, 5);
        
        // 翻译文章内容
        add_filter('the_content', array($this, 'translate_content'), 10);
        add_filter('the_title', array($this, 'translate_title'), 10, 2);
        add_filter('the_excerpt', array($this, 'translate_excerpt'), 10);
        
        // REST API端点
        add_action('rest_api_init', array($this, 'register_rest_routes'));
        
        // 自动翻译(使用外部API)
        add_action('save_post', array($this, 'auto_translate_post'), 10, 3);
        
        // 翻译管理界面
        if (is_admin()) {
            add_action('admin_menu', array($this, 'add_admin_menu'));
            add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
        }
    }
    
    public function get_current_language() {
        $settings = get_option('mlt_settings', array());
        $default_lang = $settings['default_language'] ?? 'en';
        
        if (isset($_GET['lang']) && $this->is_language_enabled($_GET['lang'])) {
            return sanitize_text_field($_GET['lang']);
        }
        
        if (isset($_COOKIE['mlt_language']) && $this->is_language_enabled($_COOKIE['mlt_language'])) {
            return sanitize_text_field($_COOKIE['mlt_language']);
        }
        
        return $default_lang;
    }
    
    private function is_language_enabled($lang_code) {
        $settings = get_option('mlt_settings', array());
        $enabled_languages = $settings['enabled_languages'] ?? array('en');
        return in_array($lang_code, $enabled_languages);
    }
    
    public function translate_text($translated, $text, $domain) {
        // 如果是默认语言,直接返回
        if ($this->current_language === ($this->get_default_language())) {
            return $translated;
        }
        
        // 检查是否有缓存
        $cache_key = 'mlt_translation_' . md5($text . $domain . $this->current_language);
        $cached = wp_cache_get($cache_key, 'multilingual-tools');
        
        if ($cached !== false) {
            return $cached;
        }
        
        // 从数据库获取翻译
        global $wpdb;
        $translation = $wpdb->get_var($wpdb->prepare(
            "SELECT translated_text FROM {$this->table_name} 
            WHERE original_text = %s 
            AND language_code = %s 
            AND context = %s 
            AND type = 'string' 
            LIMIT 1",
            $text,
            $this->current_language,
            $domain
        ));
        
        if ($translation) {
            wp_cache_set($cache_key, $translation, 'multilingual-tools', HOUR_IN_SECONDS);
            return $translation;
        }
        
        // 如果没有找到翻译,可以尝试自动翻译
        if (apply_filters('mlt_auto_translate_strings', false)) {
            $auto_translation = $this->auto_translate_string($text, $this->current_language);
            if ($auto_translation) {
                $this->save_translation($text, $auto_translation, $this->current_language, $domain, 'string');
                wp_cache_set($cache_key, $auto_translation, 'multilingual-tools', HOUR_IN_SECONDS);
                return $auto_translation;
            }
        }
        
        return $translated;
    }
    
    public function translate_plural($translated, $single, $plural, $number, $domain) {
        if ($this->current_language === ($this->get_default_language())) {
            return $translated;
        }
        
        $text = ($number == 1) ? $single : $plural;
        return $this->translate_text($text, $text, $domain);
    }
    
    public function translate_content($content) {
        global $post;
        
        if (!$post || $this->current_language === ($this->get_default_language())) {
            return $content;
        }
        
        // 获取文章翻译
        $translated_content = $this->get_post_translation($post->ID, 'post_content', $this->current_language);
        
        if ($translated_content) {
            return $translated_content;
        }
        
        // 自动翻译内容
        if (apply_filters('mlt_auto_translate_content', true)) {
            $auto_translation = $this->auto_translate_text($content, $this->current_language);
            if ($auto_translation) {
                $this->save_post_translation($post->ID, 'post_content', $auto_translation, $this->current_language);
                return $auto_translation;
            }
        }
        
        return $content;
    }
    
    public function translate_title($title, $post_id = null) {
        if (!$post_id || $this->current_language === ($this->get_default_language())) {
            return $title;
        }
        
        $translated_title = $this->get_post_translation($post_id, 'post_title', $this->current_language);
        
        if ($translated_title) {
            return $translated_title;
        }
        
        if (apply_filters('mlt_auto_translate_titles', true)) {
            $auto_translation = $this->auto_translate_text($title, $this->current_language);
            if ($auto_translation) {
                $this->save_post_translation($post_id, 'post_title', $auto_translation, $this->current_language);
                return $auto_translation;
            }
        }
        
        return $title;
    }
    
    public function translate_excerpt($excerpt) {
        global $post;
        
        if (!$post || $this->current_language === ($this->get_default_language())) {
            return $excerpt;
        }
        
        $translated_excerpt = $this->get_post_translation($post->ID, 'post_excerpt', $this->current_language);
        
        if ($translated_excerpt) {
            return $translated_excerpt;
        }
        
        if (apply_filters('mlt_auto_translate_excerpts', true)) {
            $auto_translation = $this->auto_translate_text($excerpt, $this->current_language);
            if ($auto_translation) {
                $this->save_post_translation($post->ID, 'post_excerpt', $auto_translation, $this->current_language);
                return $auto_translation;
            }
        }
        
        return $excerpt;
    }
    
    private function get_post_translation($post_id, $field, $language) {
        global $wpdb;
        
        $translation = $wpdb->get_var($wpdb->prepare(
            "SELECT translated_text FROM {$this->table_name} 
            WHERE post_id = %d 
            AND language_code = %s 
            AND type = %s 
            LIMIT 1",
            $post_id,
            $language,
            $field
        ));
        
        return $translation;
    }
    
    private function save_post_translation($post_id, $field, $translation, $language) {
        global $wpdb;
        
        // 检查是否已存在
        $existing = $wpdb->get_var($wpdb->prepare(
            "SELECT id FROM {$this->table_name} 
            WHERE post_id = %d 
            AND language_code = %s 
            AND type = %s 
            LIMIT 1",
            $post_id,
            $language,
            $field
        ));
        
        if ($existing) {
            // 更新现有记录
            $wpdb->update(
                $this->table_name,
                array(
                    'translated_text' => $translation,
                    'updated_at' => current_time('mysql')
                ),
                array(
                    'post_id' => $post_id,
                    'language_code' => $language,
                    'type' => $field
                )
            );
        } else {
            // 插入新记录
            $wpdb->insert(
                $this->table_name,
                array(
                    'original_text' => '',
                    'translated_text' => $translation,
                    'language_code' => $language,
                    'type' => $field,
                    'post_id' => $post_id,
                    'created_at' => current_time('mysql'),
                    'updated_at' => current_time('mysql')
                )
            );
        }
        
        // 清除缓存
        wp_cache_delete('mlt_post_translation_' . $post_id . '_' . $field . '_' . $language, 'multilingual-tools');
    }
    
    private function save_translation($original, $translated, $language, $context = '', $type = 'string') {
        global $wpdb;
        
        $existing = $wpdb->get_var($wpdb->prepare(
            "SELECT id FROM {$this->table_name} 
            WHERE original_text = %s 
            AND language_code = %s 
            AND context = %s 
            AND type = %s 
            LIMIT 1",
            $original,
            $language,
            $context,
            $type
        ));
        
        if ($existing) {
            $wpdb->update(
                $this->table_name,
                array(
                    'translated_text' => $translated,
                    'updated_at' => current_time('mysql')
                ),
                array('id' => $existing)
            );
        } else {
            $wpdb->insert(
                $this->table_name,
                array(
                    'original_text' => $original,
                    'translated_text' => $translated,
                    'language_code' => $language,
                    'context' => $context,
                    'type' => $type,
                    'created_at' => current_time('mysql'),
                    'updated_at' => current_time('mysql')
                )
            );
        }
    }
    
    private function auto_translate_string($text, $target_lang) {
        // 使用免费的翻译API,如Google Translate(需要API密钥)
        // 这里使用模拟数据,实际使用时需要替换为真实的API调用
        $api_key = get_option('mlt_translation_api_key', '');
        
        if (empty($api_key) || strlen($text) > 5000) {
            return false;
        }
        
        // 模拟翻译 - 实际应调用API
        $translations = array(
            'en' => array(
                'hello' => 'hello',
                'welcome' => 'welcome'
            ),
            'zh' => array(
                'hello' => '你好',
                'welcome' => '欢迎'
            ),
            'es' => array(
                'hello' => 'hola',
                'welcome' => 'bienvenido'
            )
        );
        
        $text_lower = strtolower(trim($text));
        if (isset($translations[$target_lang][$text_lower])) {
            return $translations[$target_lang][$text_lower];
        }
        
        // 实际API调用示例(使用Google Translate)
        /*
        $url = "https://translation.googleapis.com/language/translate/v2";
        $response = wp_remote_post($url, array(
            'body' => array(
                'q' => $text,
                'target' => $target_lang,
                'key' => $api_key
            )
        ));
        
        if (!is_wp_error($response)) {
            $body = json_decode(wp_remote_retrieve_body($response), true);
            if (isset($body['data']['translations'][0]['translatedText'])) {
                return $body['data']['translations'][0]['translatedText'];
            }
        }
        */
        
        return false;
    }
    
    private function auto_translate_text($text, $target_lang) {
        // 对于长文本,可以分段翻译
        $max_length = 5000;
        if (strlen($text) <= $max_length) {
            return $this->auto_translate_string($text, $target_lang);
        }
        
        // 分段处理
        $paragraphs = explode("n", $text);
        $translated_paragraphs = array();
        
        foreach ($paragraphs as $paragraph) {
            if (strlen($paragraph) > $max_length) {
                // 如果段落仍然太长,进一步分割
                $sentences = preg_split('/(?<=[.?!])s+/', $paragraph);
                $translated_sentences = array();
                
                foreach ($sentences as $sentence) {
                    $translated = $this->auto_translate_string($sentence, $target_lang);
                    $translated_sentences[] = $translated ?: $sentence;
                }
                
                $translated_paragraphs[] = implode(' ', $translated_sentences);
            } else {
                $translated = $this->auto_translate_string($paragraph, $target_lang);
                $translated_paragraphs[] = $translated ?: $paragraph;
            }
        }
        
        return implode("n", $translated_paragraphs);
    }
    
    public function auto_translate_post($post_id, $post, $update) {
        // 只在发布时自动翻译
        if ($post->post_status !== 'publish' || wp_is_post_revision($post_id)) {
            return;
        }
        
        // 检查是否已经翻译过
        $already_translated = get_post_meta($post_id, '_mlt_auto_translated', true);
        if ($already_translated) {
            return;
        }
        
        $settings = get_option('mlt_settings', array());
        $enabled_languages = $settings['enabled_languages'] ?? array('en');
        $default_language = $settings['default_language'] ?? 'en';
        
        foreach ($enabled_languages as $lang) {
            if ($lang === $default_language) {
                continue;
            }
            
            // 翻译标题
            $translated_title = $this->auto_translate_text($post->post_title, $lang);
            if ($translated_title) {
                $this->save_post_translation($post_id, 'post_title', $translated_title, $lang);
            }
            
            // 翻译内容
            $translated_content = $this->auto_translate_text($post->post_content, $lang);
            if ($translated_content) {
                $this->save_post_translation($post_id, 'post_content', $translated_content, $lang);
            }
            
            // 翻译摘要
            if (!empty($post->post_excerpt)) {
                $translated_excerpt = $this->auto_translate_text($post->post_excerpt, $lang);
                if ($translated_excerpt) {
                    $this->save_post_translation($post_id, 'post_excerpt', $translated_excerpt, $lang);
                }
            }
        }
        
        update_post_meta($post_id, '_mlt_auto_translated', true);
    }
    
    public function register_rest_routes() {
        register_rest_route('mlt/v1', '/translations', array(
            'methods' => 'GET',
            'callback' => array($this, 'get_translations_api'),
            'permission_callback' => function() {
                return current_user_can('manage_options');
            }
        ));
        
        register_rest_route('mlt/v1', '/translations', array(
            'methods' => 'POST',
            'callback' => array($this, 'save_translation_api'),
            'permission_callback' => function() {
                return current_user_can('manage_options');
            }
        ));
        
        register_rest_route('mlt/v1', '/translate', array(
            'methods' => 'POST',
            'callback' => array($this, 'translate_text_api'),
            'permission_callback' => function() {
                return current_user_can('edit_posts');
            }
        ));
    }
    
    public function add_admin_menu() {
        add_menu_page(
            __('Translations', 'multilingual-tools'),
            __('Translations', 'multilingual-tools'),
            'manage_options',
            'mlt-translations',
            array($this, 'render_translations_page'),
            'dashicons-translation',
            30
        );
        
        add_submenu_page(
            'mlt-translations',
            __('String Translations', 'multilingual-tools'),
            __('Strings', 'multilingual-tools'),
            'manage_options',
            'mlt-string-translations',
            array($this, 'render_string_translations_page')
        );
        
        add_submenu_page(
            'mlt-translations',
            __('Content Translations', 'multilingual-tools'),
            __('Content', 'multilingual-tools'),
            'manage_options',
            'mlt-content-translations',
            array($this, 'render_content_translations_page')
        );
    }
    
    public function enqueue_admin_scripts($hook) {
        if (strpos($hook, 'mlt-') === false) {
            return;
        }
        
        wp_enqueue_style(
            'mlt-admin-style',
            MLT_PLUGIN_URL . 'admin/css/admin.css',
            array(),
            MLT_VERSION
        );
        
        wp_enqueue_script(
            'mlt-admin-script',
            MLT_PLUGIN_URL . 'admin/js/admin.js',
            array('jquery', 'wp-api'),
            MLT_VERSION,
            true
        );
        
        wp_localize_script('mlt-admin-script', 'mlt_admin', array(
            'ajax_url' => admin_url('admin-ajax.php'),
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5068.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部