You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Cookie记住字幕语言?PHP+MySQL环境下的实现需求

实现带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:55:13