文章目录
-
- 在全球化时代,网站多语言化已成为吸引国际用户、扩大影响力的重要策略。据统计,超过75%的互联网用户更倾向于使用母语浏览内容,而超过50%的用户表示不会从不支持自己语言的网站购买产品。对于WordPress网站而言,添加多语言功能不仅能提升用户体验,还能显著提高国际搜索引擎排名和转化率。 本文将详细介绍三种为WordPress网站添加多语言翻译工具的方法:使用插件、自定义代码实现以及结合第三方翻译API。无论您是初学者还是有经验的开发者,都能找到适合您需求的解决方案。
-
- WordPress生态系统中有多款优秀的多语言插件,其中最受欢迎的是: WPML(WordPress Multilingual Plugin):功能全面,支持40多种语言 Polylang:轻量级免费插件,适合中小型网站 Weglot:基于云翻译服务,自动化程度高 本教程将以Polylang为例,因为它免费且易于使用。
- 步骤1:安装插件 登录WordPress后台 进入"插件" → "安装插件" 搜索"Polylang" 点击"立即安装",然后激活 步骤2:基本配置 激活后,进入"语言" → "设置" 在"语言"选项卡中添加需要的语言(如英语、西班牙语等) 设置默认语言 在"URL修改"中选择语言识别方式(推荐使用目录形式,如example.com/en/) 步骤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'); // 直接输出翻译后的文本 }
-
- 对于开发者或需要高度定制化的网站,可以创建自定义多语言系统: // 在主题的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(); }
- 在主题目录下创建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', ];
-
- 多语言网站的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');
- 启用缓存:使用WP Rocket或W3 Total Cache缓存翻译页面 懒加载翻译:对非关键内容使用AJAX延迟加载翻译 CDN加速:使用CDN服务加速多语言静态资源
- 智能语言检测:基于用户IP、浏览器设置自动跳转 语言切换器持久化:记住用户的语言选择 翻译质量反馈:允许用户报告翻译问题
- Q1: 多语言插件会影响网站速度吗?A: 合理配置的插件对速度影响很小。建议启用缓存并选择轻量级插件如Polylang。 Q2: 如何翻译Woocommerce产品?A: WPML和Polylang都有Woocommerce扩展,可以完美翻译产品、属性和分类。 Q3: 自动翻译和人工翻译哪个更好?A: 关键页面(首页、产品页、联系页)建议人工翻译,博客文章等可以使用自动翻译加人工校对。 Q4: 多语言网站如何维护?A: 建立翻译工作流,使用ACF(高级自定义字段)管理多语言内容,定期审核翻译质量。
- 为WordPress网站添加多语言功能不再是复杂的技术挑战。无论您选择使用成熟的插件、自定义开发还是集成第三方API,都能找到适合您需求和技能水平的解决方案。关键是根据您的具体需求(预算、内容量、维护能力)选择最合适的方法。 记住,多语言不仅仅是技术实现,更是对全球用户的尊重和承诺。良好的多语言体验将为您打开国际市场的大门,带来更广泛的受众和更多的商业机会。 开始行动吧,让您的WordPress网站与世界对话!
-
-
- 对于大型多语言网站,需要设计合理的数据库结构来存储翻译内容: // 创建自定义翻译表 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');
- 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();
-
- 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); } } }
- // 延迟加载翻译资源 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') ]); } // 条件加载语言特定样式
-
在全球化时代,网站多语言化已成为吸引国际用户、扩大影响力的重要策略。据统计,超过75%的互联网用户更倾向于使用母语浏览内容,而超过50%的用户表示不会从不支持自己语言的网站购买产品。对于WordPress网站而言,添加多语言功能不仅能提升用户体验,还能显著提高国际搜索引擎排名和转化率。
本文将详细介绍三种为WordPress网站添加多语言翻译工具的方法:使用插件、自定义代码实现以及结合第三方翻译API。无论您是初学者还是有经验的开发者,都能找到适合您需求的解决方案。
WordPress生态系统中有多款优秀的多语言插件,其中最受欢迎的是:
- WPML(WordPress Multilingual Plugin):功能全面,支持40多种语言
- Polylang:轻量级免费插件,适合中小型网站
- Weglot:基于云翻译服务,自动化程度高
本教程将以Polylang为例,因为它免费且易于使用。
步骤1:安装插件
- 登录WordPress后台
- 进入"插件" → "安装插件"
- 搜索"Polylang"
- 点击"立即安装",然后激活
步骤2:基本配置
- 激活后,进入"语言" → "设置"
- 在"语言"选项卡中添加需要的语言(如英语、西班牙语等)
- 设置默认语言
- 在"URL修改"中选择语言识别方式(推荐使用目录形式,如example.com/en/)
步骤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'); // 直接输出翻译后的文本
}
对于开发者或需要高度定制化的网站,可以创建自定义多语言系统:
// 在主题的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();
}
在主题目录下创建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',
];
对于需要实时翻译或大量内容的情况,可以集成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']);
多语言网站的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');
- 启用缓存:使用WP Rocket或W3 Total Cache缓存翻译页面
- 懒加载翻译:对非关键内容使用AJAX延迟加载翻译
- CDN加速:使用CDN服务加速多语言静态资源
- 智能语言检测:基于用户IP、浏览器设置自动跳转
- 语言切换器持久化:记住用户的语言选择
- 翻译质量反馈:允许用户报告翻译问题
Q1: 多语言插件会影响网站速度吗?
A: 合理配置的插件对速度影响很小。建议启用缓存并选择轻量级插件如Polylang。
Q2: 如何翻译Woocommerce产品?
A: WPML和Polylang都有Woocommerce扩展,可以完美翻译产品、属性和分类。
Q3: 自动翻译和人工翻译哪个更好?
A: 关键页面(首页、产品页、联系页)建议人工翻译,博客文章等可以使用自动翻译加人工校对。
Q4: 多语言网站如何维护?
A: 建立翻译工作流,使用ACF(高级自定义字段)管理多语言内容,定期审核翻译质量。
为WordPress网站添加多语言功能不再是复杂的技术挑战。无论您选择使用成熟的插件、自定义开发还是集成第三方API,都能找到适合您需求和技能水平的解决方案。关键是根据您的具体需求(预算、内容量、维护能力)选择最合适的方法。
记住,多语言不仅仅是技术实现,更是对全球用户的尊重和承诺。良好的多语言体验将为您打开国际市场的大门,带来更广泛的受众和更多的商业机会。
开始行动吧,让您的WordPress网站与世界对话!
对于大型多语言网站,需要设计合理的数据库结构来存储翻译内容:
// 创建自定义翻译表
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');
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();
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();
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);
}
}
}
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);
}
}
}
// 延迟加载翻译资源
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')
]);
}
// 条件加载语言特定样式
// 延迟加载翻译资源
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')
]);
}
// 条件加载语言特定样式


