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

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

手把手教学:为WordPress网站添加多语言翻译工具 引言:为什么需要多语言支持? 在全球化时代,网站多语言化已成为吸引国际用户、扩大影响力的重要策略。据统计,超过75%的互联网用户更倾向于使用母语浏览内容,而超过50%的用户表示不会从不支持自己语言的网站…

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

引言:为什么需要多语言支持?

在全球化时代,网站多语言化已成为吸引国际用户、扩大影响力的重要策略。据统计,超过75%的互联网用户更倾向于使用母语浏览内容,而超过50%的用户表示不会从不支持自己语言的网站购买产品。对于WordPress网站而言,添加多语言功能不仅能提升用户体验,还能显著提高国际搜索引擎排名和转化率。

本文将详细介绍三种为WordPress网站添加多语言翻译工具的方法:使用插件、自定义代码实现以及结合第三方翻译API。无论您是初学者还是有经验的开发者,都能找到适合您需求的解决方案。

方法一:使用多语言插件(推荐初学者)

1.1 选择适合的插件

WordPress生态系统中有多款优秀的多语言插件,其中最受欢迎的是:

  • WPML(WordPress Multilingual Plugin):功能全面,支持40多种语言
  • Polylang:轻量级免费插件,适合中小型网站
  • Weglot:基于云翻译服务,自动化程度高

本教程将以Polylang为例,因为它免费且易于使用。

1.2 安装和配置Polylang

步骤1:安装插件

  1. 登录WordPress后台
  2. 进入"插件" → "安装插件"
  3. 搜索"Polylang"
  4. 点击"立即安装",然后激活

步骤2:基本配置

  1. 激活后,进入"语言" → "设置"
  2. 在"语言"选项卡中添加需要的语言(如英语、西班牙语等)
  3. 设置默认语言
  4. 在"URL修改"中选择语言识别方式(推荐使用目录形式,如example.com/en/)

步骤3:翻译内容

  1. 创建或编辑文章/页面时,会看到语言选择框
  2. 为每种语言创建对应的翻译版本
  3. 使用"+"按钮快速创建翻译副本

1.3 翻译主题字符串

Polylang可以翻译主题和插件中的硬编码字符串:

// 示例:在主题中正确使用翻译函数
// 在主题的functions.php或模板文件中

// 1. 使用Polylang的翻译函数
if (function_exists('pll__')) {
    $translated_text = pll__('Welcome to our website');
    echo $translated_text;
}

// 2. 注册可翻译字符串
add_action('init', function() {
    if (function_exists('pll_register_string')) {
        // 注册主题中需要翻译的字符串
        pll_register_string('mytheme', 'Read More');
        pll_register_string('mytheme', 'Contact Us');
        pll_register_string('mytheme', 'Search...');
    }
});

// 3. 在模板中使用
if (function_exists('pll_e')) {
    pll_e('Read More'); // 直接输出翻译后的文本
}

方法二:自定义多语言解决方案

2.1 创建语言文件系统

对于开发者或需要高度定制化的网站,可以创建自定义多语言系统:

// 在主题的functions.php中添加以下代码

class Custom_Multilingual {
    private $current_lang;
    private $available_langs = ['en', 'es', 'fr'];
    private $translations = [];
    
    public function __construct() {
        $this->detect_language();
        $this->load_translations();
        add_action('init', [$this, 'init_hooks']);
    }
    
    // 检测当前语言
    private function detect_language() {
        // 1. 检查URL参数
        if (isset($_GET['lang']) && in_array($_GET['lang'], $this->available_langs)) {
            $this->current_lang = $_GET['lang'];
            setcookie('site_lang', $this->current_lang, time() + (86400 * 30), "/");
        }
        // 2. 检查Cookie
        elseif (isset($_COOKIE['site_lang']) && in_array($_COOKIE['site_lang'], $this->available_langs)) {
            $this->current_lang = $_COOKIE['site_lang'];
        }
        // 3. 检查浏览器语言
        else {
            $browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
            $this->current_lang = in_array($browser_lang, $this->available_langs) ? $browser_lang : 'en';
        }
    }
    
    // 加载翻译文件
    private function load_translations() {
        $lang_file = get_template_directory() . '/languages/' . $this->current_lang . '.php';
        
        if (file_exists($lang_file)) {
            $this->translations = include($lang_file);
        } else {
            // 默认英语翻译
            $this->translations = include(get_template_directory() . '/languages/en.php');
        }
    }
    
    // 初始化钩子
    public function init_hooks() {
        // 添加语言切换器到菜单
        add_filter('wp_nav_menu_items', [$this, 'add_language_switcher'], 10, 2);
        
        // 过滤内容
        add_filter('the_title', [$this, 'translate_string']);
        add_filter('the_content', [$this, 'translate_content']);
    }
    
    // 翻译字符串
    public function translate_string($text) {
        if (isset($this->translations[$text])) {
            return $this->translations[$text];
        }
        return $text;
    }
    
    // 翻译内容(简化版)
    public function translate_content($content) {
        // 这里可以添加更复杂的内容翻译逻辑
        // 例如替换特定短语或短代码
        foreach ($this->translations as $original => $translation) {
            $content = str_replace($original, $translation, $content);
        }
        return $content;
    }
    
    // 添加语言切换器
    public function add_language_switcher($items, $args) {
        if ($args->theme_location == 'primary') {
            $switcher = '<li class="menu-item language-switcher">';
            $switcher .= '<span class="current-language">' . strtoupper($this->current_lang) . '</span>';
            $switcher .= '<ul class="sub-menu">';
            
            foreach ($this->available_langs as $lang) {
                if ($lang != $this->current_lang) {
                    $url = add_query_arg('lang', $lang, home_url($_SERVER['REQUEST_URI']));
                    $lang_name = ($lang == 'en') ? 'English' : (($lang == 'es') ? 'Español' : 'Français');
                    $switcher .= '<li><a href="' . $url . '">' . $lang_name . '</a></li>';
                }
            }
            
            $switcher .= '</ul></li>';
            $items .= $switcher;
        }
        return $items;
    }
    
    // 获取当前语言
    public function get_current_lang() {
        return $this->current_lang;
    }
}

// 初始化多语言系统
$custom_multilingual = new Custom_Multilingual();

// 辅助函数,方便在模板中使用
function custom_translate($text) {
    global $custom_multilingual;
    return $custom_multilingual->translate_string($text);
}

function get_current_language() {
    global $custom_multilingual;
    return $custom_multilingual->get_current_lang();
}

2.2 创建翻译文件

在主题目录下创建languages文件夹,然后为每种语言创建PHP文件:

// languages/en.php - 英语翻译文件
<?php
return [
    'Welcome' => 'Welcome',
    'Read More' => 'Read More',
    'Contact Us' => 'Contact Us',
    'Search' => 'Search',
    'About Us' => 'About Us',
    'Our Services' => 'Our Services',
    'Latest News' => 'Latest News',
    'Home' => 'Home',
];

// languages/es.php - 西班牙语翻译文件
<?php
return [
    'Welcome' => 'Bienvenido',
    'Read More' => 'Leer Más',
    'Contact Us' => 'Contáctenos',
    'Search' => 'Buscar',
    'About Us' => 'Sobre Nosotros',
    'Our Services' => 'Nuestros Servicios',
    'Latest News' => 'Últimas Noticias',
    'Home' => 'Inicio',
];

方法三:集成第三方翻译API

3.1 使用Google Translate API

对于需要实时翻译或大量内容的情况,可以集成Google Translate API:

// 在主题的functions.php中添加Google翻译功能

class Google_Translate_Integration {
    private $api_key;
    private $cache_time = 604800; // 缓存一周
    
    public function __construct($api_key) {
        $this->api_key = $api_key;
        add_action('wp_ajax_translate_content', [$this, 'ajax_translate_content']);
        add_action('wp_ajax_nopriv_translate_content', [$this, 'ajax_translate_content']);
    }
    
    // 翻译文本
    public function translate_text($text, $target_lang, $source_lang = 'en') {
        // 检查缓存
        $cache_key = 'translation_' . md5($text . $target_lang);
        $cached = get_transient($cache_key);
        
        if ($cached !== false) {
            return $cached;
        }
        
        // 调用Google Translate API
        $url = 'https://translation.googleapis.com/language/translate/v2';
        
        $args = [
            'key' => $this->api_key,
            'q' => $text,
            'target' => $target_lang,
            'source' => $source_lang,
            'format' => 'text'
        ];
        
        $response = wp_remote_post($url, [
            'body' => $args,
            'timeout' => 15
        ]);
        
        if (is_wp_error($response)) {
            error_log('Translation API error: ' . $response->get_error_message());
            return $text; // 返回原文作为降级方案
        }
        
        $body = wp_remote_retrieve_body($response);
        $data = json_decode($body, true);
        
        if (isset($data['data']['translations'][0]['translatedText'])) {
            $translated = $data['data']['translations'][0]['translatedText'];
            
            // 缓存结果
            set_transient($cache_key, $translated, $this->cache_time);
            
            return $translated;
        }
        
        return $text;
    }
    
    // AJAX翻译处理
    public function ajax_translate_content() {
        // 安全检查
        if (!wp_verify_nonce($_POST['nonce'], 'translate_nonce')) {
            wp_die('Security check failed');
        }
        
        $content = isset($_POST['content']) ? stripslashes($_POST['content']) : '';
        $target_lang = isset($_POST['target_lang']) ? sanitize_text_field($_POST['target_lang']) : 'es';
        
        if (empty($content)) {
            wp_send_json_error('No content provided');
        }
        
        // 简单HTML内容处理(实际应用中需要更复杂的HTML解析)
        $translated = $this->translate_text($content, $target_lang);
        
        wp_send_json_success([
            'translated_content' => $translated,
            'target_lang' => $target_lang
        ]);
    }
    
    // 在前端添加翻译按钮
    public function add_translation_buttons() {
        if (is_single() || is_page()) {
            ?>
            <div class="translation-widget">
                <span>Translate:</span>
                <button class="translate-btn" data-lang="es">Español</button>
                <button class="translate-btn" data-lang="fr">Français</button>
                <button class="translate-btn" data-lang="de">Deutsch</button>
                <button class="translate-btn" data-lang="zh-CN">中文</button>
            </div>
            
            <script>
            jQuery(document).ready(function($) {
                $('.translate-btn').click(function() {
                    var targetLang = $(this).data('lang');
                    var content = $('.entry-content').html();
                    var nonce = '<?php echo wp_create_nonce("translate_nonce"); ?>';
                    
                    // 显示加载状态
                    $(this).text('Translating...').prop('disabled', true);
                    
                    $.ajax({
                        url: '<?php echo admin_url("admin-ajax.php"); ?>',
                        type: 'POST',
                        data: {
                            action: 'translate_content',
                            content: content,
                            target_lang: targetLang,
                            nonce: nonce
                        },
                        success: function(response) {
                            if (response.success) {
                                $('.entry-content').html(response.data.translated_content);
                                $('.translate-btn').text('Translated').prop('disabled', true);
                            } else {
                                alert('Translation failed: ' + response.data);
                                $('.translate-btn').prop('disabled', false);
                            }
                        },
                        error: function() {
                            alert('Translation request failed');
                            $('.translate-btn').prop('disabled', false);
                        }
                    });
                });
            });
            </script>
            
            <style>
            .translation-widget {
                margin: 20px 0;
                padding: 15px;
                background: #f5f5f5;
                border-radius: 5px;
                text-align: center;
            }
            .translation-widget span {
                margin-right: 10px;
                font-weight: bold;
            }
            .translate-btn {
                margin: 0 5px;
                padding: 8px 15px;
                background: #0073aa;
                color: white;
                border: none;
                border-radius: 3px;
                cursor: pointer;
                transition: background 0.3s;
            }
            .translate-btn:hover {
                background: #005a87;
            }
            .translate-btn:disabled {
                background: #cccccc;
                cursor: not-allowed;
            }
            </style>
            <?php
        }
    }
}

// 初始化(需要替换为您的Google API密钥)
$google_translate = new Google_Translate_Integration('YOUR_GOOGLE_API_KEY_HERE');
add_action('wp_footer', [$google_translate, 'add_translation_buttons']);

最佳实践和优化建议

4.1 SEO优化

多语言网站的SEO至关重要:

// 添加hreflang标签
function add_hreflang_tags() {
    if (class_exists('Custom_Multilingual')) {
        global $custom_multilingual;
        $current_url = get_permalink();
        $languages = ['en', 'es', 'fr']; // 您的支持语言
        
        foreach ($languages as $lang) {
            $lang_url = add_query_arg('lang', $lang, $current_url);
            echo '<link rel="alternate" hreflang="' . $lang . '" href="' . $lang_url . '" />' . "n";
        }
        // x-default标签
        echo '<link rel="alternate" hreflang="x-default" href="' . home_url() . '" />' . "n";
    }
}
add_action('wp_head', 'add_hreflang_tags');

4.2 性能优化

  1. 启用缓存:使用WP Rocket或W3 Total Cache缓存翻译页面
  2. 懒加载翻译:对非关键内容使用AJAX延迟加载翻译
  3. CDN加速:使用CDN服务加速多语言静态资源

4.3 用户体验优化

  1. 智能语言检测:基于用户IP、浏览器设置自动跳转
  2. 语言切换器持久化:记住用户的语言选择
  3. 翻译质量反馈:允许用户报告翻译问题

常见问题解答

Q1: 多语言插件会影响网站速度吗?
A: 合理配置的插件对速度影响很小。建议启用缓存并选择轻量级插件如Polylang。

Q2: 如何翻译Woocommerce产品?
A: WPML和Polylang都有Woocommerce扩展,可以完美翻译产品、属性和分类。

Q3: 自动翻译和人工翻译哪个更好?
A: 关键页面(首页、产品页、联系页)建议人工翻译,博客文章等可以使用自动翻译加人工校对。

Q4: 多语言网站如何维护?
A: 建立翻译工作流,使用ACF(高级自定义字段)管理多语言内容,定期审核翻译质量。

结语

为WordPress网站添加多语言功能不再是复杂的技术挑战。无论您选择使用成熟的插件、自定义开发还是集成第三方API,都能找到适合您需求和技能水平的解决方案。关键是根据您的具体需求(预算、内容量、维护能力)选择最合适的方法。

记住,多语言不仅仅是技术实现,更是对全球用户的尊重和承诺。良好的多语言体验将为您打开国际市场的大门,带来更广泛的受众和更多的商业机会。

开始行动吧,让您的WordPress网站与世界对话!

手把手教学:为WordPress网站添加多语言翻译工具(续篇)

五、高级实现:构建完整的自定义多语言框架

5.1 数据库架构设计

对于大型多语言网站,需要设计合理的数据库结构来存储翻译内容:

// 创建自定义翻译表
function create_multilingual_tables() {
    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate();
    
    // 翻译内容表
    $table_name = $wpdb->prefix . 'multilingual_content';
    
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        original_id bigint(20) NOT NULL,
        post_type varchar(50) NOT NULL,
        language_code varchar(10) NOT NULL,
        title text NOT NULL,
        content longtext NOT NULL,
        excerpt text,
        status varchar(20) DEFAULT 'draft',
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        KEY original_id (original_id),
        KEY language_code (language_code),
        KEY post_type (post_type),
        UNIQUE KEY unique_translation (original_id, language_code)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
    
    // 翻译字符串表
    $strings_table = $wpdb->prefix . 'multilingual_strings';
    
    $sql2 = "CREATE TABLE IF NOT EXISTS $strings_table (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        string_key varchar(255) NOT NULL,
        context varchar(100) DEFAULT 'theme',
        original_text text NOT NULL,
        translations longtext,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        UNIQUE KEY string_key_context (string_key, context)
    ) $charset_collate;";
    
    dbDelta($sql2);
}
register_activation_hook(__FILE__, 'create_multilingual_tables');

5.2 高级翻译管理器类

class Advanced_Translation_Manager {
    private static $instance = null;
    private $current_language;
    private $default_language = 'en';
    private $supported_languages = ['en', 'es', 'fr', 'de', 'zh'];
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __construct() {
        $this->init();
    }
    
    private function init() {
        $this->detect_language();
        $this->setup_hooks();
        $this->load_translation_files();
    }
    
    private function detect_language() {
        // 1. URL参数优先
        if (isset($_GET['lang']) && in_array($_GET['lang'], $this->supported_languages)) {
            $this->current_language = $_GET['lang'];
            setcookie('site_language', $this->current_language, time() + YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
        }
        // 2. Cookie检测
        elseif (isset($_COOKIE['site_language']) && in_array($_COOKIE['site_language'], $this->supported_languages)) {
            $this->current_language = $_COOKIE['site_language'];
        }
        // 3. 浏览器语言检测
        else {
            $this->current_language = $this->get_browser_language();
        }
    }
    
    private function get_browser_language() {
        $browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
        return in_array($browser_lang, $this->supported_languages) ? $browser_lang : $this->default_language;
    }
    
    private function setup_hooks() {
        // 重写规则
        add_action('init', [$this, 'add_rewrite_rules']);
        add_filter('query_vars', [$this, 'add_query_vars']);
        
        // 内容过滤
        add_filter('the_title', [$this, 'translate_post_title'], 10, 2);
        add_filter('the_content', [$this, 'translate_post_content']);
        add_filter('gettext', [$this, 'translate_theme_text'], 10, 3);
        
        // 管理员界面
        add_action('add_meta_boxes', [$this, 'add_translation_meta_box']);
        add_action('save_post', [$this, 'save_translation_meta'], 10, 2);
        
        // REST API端点
        add_action('rest_api_init', [$this, 'register_rest_endpoints']);
    }
    
    public function add_rewrite_rules() {
        // 添加语言前缀到URL
        foreach ($this->supported_languages as $lang) {
            if ($lang !== $this->default_language) {
                add_rewrite_rule(
                    '^' . $lang . '/(.*)?',
                    'index.php?lang=' . $lang . '&pagename=$matches[1]',
                    'top'
                );
            }
        }
        
        // 刷新重写规则(仅在需要时)
        if (get_option('multilingual_rewrite_flushed') !== '1') {
            flush_rewrite_rules();
            update_option('multilingual_rewrite_flushed', '1');
        }
    }
    
    public function add_query_vars($vars) {
        $vars[] = 'lang';
        return $vars;
    }
    
    public function translate_post_title($title, $post_id = null) {
        if (is_admin() || !$post_id) {
            return $title;
        }
        
        if ($this->current_language === $this->default_language) {
            return $title;
        }
        
        $translated_title = $this->get_post_translation($post_id, 'title');
        return $translated_title ?: $title;
    }
    
    public function translate_post_content($content) {
        global $post;
        
        if (is_admin() || !isset($post->ID) || $this->current_language === $this->default_language) {
            return $content;
        }
        
        $translated_content = $this->get_post_translation($post->ID, 'content');
        return $translated_content ?: $content;
    }
    
    private function get_post_translation($post_id, $field) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'multilingual_content';
        
        $query = $wpdb->prepare(
            "SELECT $field FROM $table_name 
            WHERE original_id = %d 
            AND language_code = %s 
            AND status = 'published'",
            $post_id,
            $this->current_language
        );
        
        return $wpdb->get_var($query);
    }
    
    public function add_translation_meta_box() {
        $post_types = get_post_types(['public' => true]);
        
        foreach ($post_types as $post_type) {
            add_meta_box(
                'multilingual_translations',
                __('Translations', 'textdomain'),
                [$this, 'render_translation_meta_box'],
                $post_type,
                'side',
                'high'
            );
        }
    }
    
    public function render_translation_meta_box($post) {
        wp_nonce_field('save_translations', 'translation_nonce');
        
        echo '<div class="translation-status">';
        echo '<p><strong>' . __('Current Language', 'textdomain') . ':</strong> ' . strtoupper($this->default_language) . '</p>';
        
        foreach ($this->supported_languages as $lang) {
            if ($lang === $this->default_language) continue;
            
            $status = $this->get_translation_status($post->ID, $lang);
            $status_class = $status ? 'status-translated' : 'status-untranslated';
            $status_text = $status ? __('Translated', 'textdomain') : __('Not Translated', 'textdomain');
            
            echo '<div class="language-row ' . $status_class . '">';
            echo '<span class="language-flag">' . strtoupper($lang) . '</span>';
            echo '<span class="language-status">' . $status_text . '</span>';
            echo '<a href="#" class="edit-translation" data-lang="' . $lang . '" data-post="' . $post->ID . '">' . __('Edit', 'textdomain') . '</a>';
            echo '</div>';
        }
        
        echo '</div>';
        
        // 内联编辑表单
        echo '<div id="translation-editor" style="display:none;">';
        echo '<textarea id="translation-content" rows="10" style="width:100%;"></textarea>';
        echo '<button id="save-translation" class="button button-primary">' . __('Save Translation', 'textdomain') . '</button>';
        echo '</div>';
        
        // 添加必要的JavaScript
        $this->enqueue_admin_scripts();
    }
    
    private function enqueue_admin_scripts() {
        ?>
        <script>
        jQuery(document).ready(function($) {
            $('.edit-translation').click(function(e) {
                e.preventDefault();
                
                var lang = $(this).data('lang');
                var postId = $(this).data('post');
                
                // 显示加载指示器
                $(this).text('Loading...');
                
                // 获取现有翻译
                $.ajax({
                    url: ajaxurl,
                    type: 'POST',
                    data: {
                        action: 'get_translation',
                        post_id: postId,
                        language: lang,
                        nonce: '<?php echo wp_create_nonce("translation_ajax"); ?>'
                    },
                    success: function(response) {
                        if (response.success) {
                            $('#translation-content').val(response.data.content);
                            $('#translation-editor').show().data('lang', lang).data('post', postId);
                        }
                    },
                    complete: function() {
                        $('.edit-translation').text('Edit');
                    }
                });
            });
            
            $('#save-translation').click(function() {
                var editor = $('#translation-editor');
                var lang = editor.data('lang');
                var postId = editor.data('post');
                var content = $('#translation-content').val();
                
                $.ajax({
                    url: ajaxurl,
                    type: 'POST',
                    data: {
                        action: 'save_translation',
                        post_id: postId,
                        language: lang,
                        content: content,
                        nonce: '<?php echo wp_create_nonce("translation_ajax"); ?>'
                    },
                    success: function(response) {
                        if (response.success) {
                            alert('Translation saved!');
                            location.reload();
                        }
                    }
                });
            });
        });
        </script>
        
        <style>
        .language-row {
            padding: 8px;
            margin: 5px 0;
            border: 1px solid #ddd;
            border-radius: 3px;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .status-translated {
            background-color: #f0f9f0;
            border-color: #46b450;
        }
        .status-untranslated {
            background-color: #fef7f1;
            border-color: #ffb900;
        }
        .language-flag {
            font-weight: bold;
        }
        .edit-translation {
            text-decoration: none;
        }
        </style>
        <?php
    }
    
    public function register_rest_endpoints() {
        register_rest_route('multilingual/v1', '/translate', [
            'methods' => 'POST',
            'callback' => [$this, 'handle_translation_request'],
            'permission_callback' => function() {
                return current_user_can('edit_posts');
            }
        ]);
        
        register_rest_route('multilingual/v1', '/languages', [
            'methods' => 'GET',
            'callback' => [$this, 'get_supported_languages'],
            'permission_callback' => '__return_true'
        ]);
    }
    
    public function handle_translation_request(WP_REST_Request $request) {
        $text = $request->get_param('text');
        $target_lang = $request->get_param('target_lang');
        $source_lang = $request->get_param('source_lang') ?: $this->default_language;
        
        // 这里可以集成各种翻译服务
        $translated = $this->translate_with_deepl($text, $target_lang, $source_lang);
        
        return new WP_REST_Response([
            'original' => $text,
            'translated' => $translated,
            'source_lang' => $source_lang,
            'target_lang' => $target_lang
        ], 200);
    }
    
    private function translate_with_deepl($text, $target_lang, $source_lang) {
        // DeepL API集成示例
        $api_key = get_option('deepl_api_key');
        
        if (!$api_key) {
            return $text; // 返回原文作为降级
        }
        
        $url = 'https://api-free.deepl.com/v2/translate';
        
        $response = wp_remote_post($url, [
            'body' => [
                'auth_key' => $api_key,
                'text' => $text,
                'target_lang' => strtoupper($target_lang),
                'source_lang' => strtoupper($source_lang)
            ],
            'timeout' => 15
        ]);
        
        if (is_wp_error($response)) {
            error_log('DeepL API Error: ' . $response->get_error_message());
            return $text;
        }
        
        $body = json_decode(wp_remote_retrieve_body($response), true);
        
        if (isset($body['translations'][0]['text'])) {
            return $body['translations'][0]['text'];
        }
        
        return $text;
    }
}

// 初始化管理器
$translation_manager = Advanced_Translation_Manager::get_instance();

六、性能优化与缓存策略

6.1 翻译缓存系统

class Translation_Cache_System {
    private $cache_group = 'multilingual';
    private $cache_expiration = 86400; // 24小时
    
    public function get_cached_translation($key, $language) {
        $cache_key = $this->generate_cache_key($key, $language);
        $cached = wp_cache_get($cache_key, $this->cache_group);
        
        if ($cached !== false) {
            return $cached;
        }
        
        // 检查数据库缓存
        global $wpdb;
        $table_name = $wpdb->prefix . 'translation_cache';
        
        $result = $wpdb->get_var($wpdb->prepare(
            "SELECT translation FROM $table_name 
            WHERE original_key = %s 
            AND language = %s 
            AND expires_at > NOW()",
            $key,
            $language
        ));
        
        if ($result) {
            wp_cache_set($cache_key, $result, $this->cache_group, $this->cache_expiration);
            return $result;
        }
        
        return false;
    }
    
    public function cache_translation($key, $language, $translation) {
        $cache_key = $this->generate_cache_key($key, $language);
        
        // 内存缓存
        wp_cache_set($cache_key, $translation, $this->cache_group, $this->cache_expiration);
        
        // 数据库缓存
        global $wpdb;
        $table_name = $wpdb->prefix . 'translation_cache';
        
        $wpdb->replace(
            $table_name,
            [
                'original_key' => $key,
                'language' => $language,
                'translation' => $translation,
                'created_at' => current_time('mysql'),
                'expires_at' => date('Y-m-d H:i:s', time() + $this->cache_expiration)
            ],
            ['%s', '%s', '%s', '%s', '%s']
        );
    }
    
    private function generate_cache_key($key, $language) {
        return md5($key . '_' . $language);
    }
    
    public function preload_translations() {
        // 预加载常用翻译
        $common_phrases = [
            'Read More', 'Contact Us', 'Search', 'Home',
            'About', 'Services', 'Products', 'Blog'
        ];
        
        foreach ($common_phrases as $phrase) {
            foreach (['es', 'fr', 'de'] as $lang) {
                $this->warm_cache($phrase, $lang);
            }
        }
    }
    
    private function warm_cache($text, $language) {
        $cached = $this->get_cached_translation($text, $language);
        
        if (!$cached) {
            // 触发翻译并缓存
            $translated = apply_filters('translate_text', $text, $language);
            $this->cache_translation($text, $language, $translated);
        }
    }
}

6.2 延迟加载与代码分割

// 延迟加载翻译资源
function enqueue_translation_assets() {
    // 主翻译脚本
    wp_enqueue_script(
        'multilingual-core',
        get_template_directory_uri() . '/js/multilingual-core.js',
        [],
        '1.0.0',
        true
    );
    
    // 延迟加载翻译模块
    if (is_singular()) {
        wp_enqueue_script(
            'multilingual-content',
            get_template_directory_uri() . '/js/multilingual-content.js',
            ['multilingual-core'],
            '1.0.0',
            true
        );
        
        // 内联数据
        wp_localize_script('multilingual-content', 'multilingualData', [
            'currentLang' => get_current_language(),
            'postId' => get_the_ID(),
            'ajaxUrl' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('translation_nonce')
        ]);
    }
    
    // 条件加载语言特定样式
本文来自网络投稿,不代表本站点的立场,转载请注明出处:https://www.gongxiangcang.com/5068.html

溯源库®作者

漳州柔性供应链服务有限公司 小批量订单定制化服务商( 投稿邮箱:vip@jiaochengku.com)
上一篇
下一篇

为您推荐

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@suyuanku.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部