手把手教学:为WordPress网站添加多语言翻译工具
引言:为什么需要多语言支持?
在全球化时代,网站多语言化已成为吸引国际用户、扩大影响力的重要策略。据统计,超过75%的互联网用户更倾向于使用母语浏览内容,而超过50%的用户表示不会从不支持自己语言的网站购买产品。对于WordPress网站而言,添加多语言功能不仅能提升用户体验,还能显著提高国际搜索引擎排名和转化率。
本文将详细介绍三种为WordPress网站添加多语言翻译工具的方法:使用插件、自定义代码实现以及结合第三方翻译API。无论您是初学者还是有经验的开发者,都能找到适合您需求的解决方案。
方法一:使用多语言插件(推荐初学者)
1.1 选择适合的插件
WordPress生态系统中有多款优秀的多语言插件,其中最受欢迎的是:
- WPML(WordPress Multilingual Plugin):功能全面,支持40多种语言
- Polylang:轻量级免费插件,适合中小型网站
- Weglot:基于云翻译服务,自动化程度高
本教程将以Polylang为例,因为它免费且易于使用。
1.2 安装和配置Polylang
步骤1:安装插件
- 登录WordPress后台
- 进入"插件" → "安装插件"
- 搜索"Polylang"
- 点击"立即安装",然后激活
步骤2:基本配置
- 激活后,进入"语言" → "设置"
- 在"语言"选项卡中添加需要的语言(如英语、西班牙语等)
- 设置默认语言
- 在"URL修改"中选择语言识别方式(推荐使用目录形式,如example.com/en/)
步骤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 性能优化
- 启用缓存:使用WP Rocket或W3 Total Cache缓存翻译页面
- 懒加载翻译:对非关键内容使用AJAX延迟加载翻译
- CDN加速:使用CDN服务加速多语言静态资源
4.3 用户体验优化
- 智能语言检测:基于用户IP、浏览器设置自动跳转
- 语言切换器持久化:记住用户的语言选择
- 翻译质量反馈:允许用户报告翻译问题
常见问题解答
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')
]);
}
// 条件加载语言特定样式


