如何用Cookie记住字幕语言?PHP+MySQL环境下的实现需求
我来帮你梳理实现思路,结合你的需求一步步落地:
一、数据库查询与字幕数据准备
首先假设你的MySQL字幕表结构大概是这样(可根据实际调整):
CREATE TABLE subtitles ( id INT PRIMARY KEY AUTO_INCREMENT, video_id INT, -- 关联对应视频的ID language_code VARCHAR(10), -- 语言标识,比如'nl'代表荷兰语、'en'代表英语 language_name VARCHAR(50), -- 前端显示的语言名称,比如'Nederlands' vtt_path VARCHAR(255) -- 字幕文件的存储路径 );
在PHP中先获取当前视频的可用字幕,同时读取用户上次选择的语言Cookie:
// 从URL或其他方式获取当前视频ID(根据你的业务逻辑调整) $video_id = $_GET['video_id'] ?? 1; // 读取用户偏好的字幕语言Cookie,默认设为荷兰语 $user_preferred_lang = $_COOKIE['subtitle_lang'] ?? 'nl'; // 数据库查询当前视频的所有可用字幕 $stmt = $pdo->prepare("SELECT language_code, language_name, vtt_path FROM subtitles WHERE video_id = ?"); $stmt->execute([$video_id]); $available_subtitles = $stmt->fetchAll(PDO::FETCH_ASSOC);
二、处理字幕默认优先级逻辑
优先使用用户Cookie保存的语言,若该语言不存在则 fallback 到荷兰语,再不行就用第一个可用的备用语言:
$default_subtitle = null; // 第一步:匹配用户上次选择的语言 foreach ($available_subtitles as $sub) { if ($sub['language_code'] === $user_preferred_lang) { $default_subtitle = $sub; break; } } // 第二步:用户偏好语言不存在时,匹配荷兰语 if (!$default_subtitle) { foreach ($available_subtitles as $sub) { if ($sub['language_code'] === 'nl') { $default_subtitle = $sub; break; } } } // 第三步:荷兰语也不存在时,用第一个可用的备用语言 if (!$default_subtitle && !empty($available_subtitles)) { $default_subtitle = $available_subtitles[0]; }
三、渲染播放器与动态字幕轨道
把字幕动态插入到video标签中,同时添加JS监听来保存用户的字幕选择到Cookie:
<div class="embed-responsive-16by9 player"> <video id="video" class="video-js vjs-default-skin player-self" poster="<?php echo htmlspecialchars($video_poster); ?>" controls> <!-- 补充你的视频源代码 --> <source src="<?php echo htmlspecialchars($video_src); ?>" type="video/mp4"> <!-- 动态渲染可用字幕轨道 --> <?php foreach ($available_subtitles as $sub): ?> <track kind="subtitles" src="<?php echo htmlspecialchars($sub['vtt_path']); ?>" srclang="<?php echo htmlspecialchars($sub['language_code']); ?>" label="<?php echo htmlspecialchars($sub['language_name']); ?>" <?php echo ($sub['language_code'] === ($default_subtitle['language_code'] ?? '')) ? 'default="true"' : ''; ?> > <?php endforeach; ?> </video> </div> <!-- 监听字幕切换并保存到Cookie --> <script> const player = videojs('video'); // 监听字幕语言变更事件 player.on('languagechange', function() { const selectedLang = player.currentLanguage(); if (selectedLang) { // 设置Cookie,有效期30天,全站生效 document.cookie = `subtitle_lang=${selectedLang}; path=/; max-age=${30*24*60*60}`; } }); </script>
四、关键细节提醒
- 安全防护:所有输出到前端的变量都用
htmlspecialchars()转义,避免XSS攻击 - 备用语言自定义:如果需要指定固定的备用语言顺序(比如先英语再法语),可以修改优先级判断的循环逻辑
- 无字幕场景:如果数据库中没有当前视频的字幕,
available_subtitles为空,播放器不会渲染任何字幕轨道,自然隐藏字幕选项
这样就能完全实现你的需求:数据库有字幕才显示、Cookie记忆用户选择、默认荷兰语+自动备用语言~
内容的提问来源于stack exchange,提问作者Stoney Eagle
相关产品推荐
相关产品推荐

