Laravel多语言站点如何实现用户提交入库内容的翻译
Laravel用户提交动态内容多语言翻译实现方案
你当前实现的是静态文本的多语言本地化,针对用户提交到数据库的动态内容,有两种可行的落地方案:
方案1:存储多语言版本的用户输入(推荐)
该方案可控性最高,性能最优,无额外接口依赖:
- 调整数据表结构:可以为需要翻译的字段新增对应语言版本的列,比如原字段
content新增content_en、content_es;也可以直接将字段类型改为JSON,统一存储所有语言的内容,格式为{"en":"英文内容","es":"西班牙文内容"} - 提交阶段处理:表单可以提供多语言输入入口,让用户自行填写不同语言的内容;如果用户只填写单一语言,可以在后台自动调用机器翻译接口预填充其他语言版本,支持后续手动修改
- 展示阶段处理:直接读取当前系统语言对应的内容即可,示例代码:
// 字段为JSON格式时的输出示例 {{ $userPost->content[App::getLocale()] ?? $userPost->content[config('app.fallback_locale')] }}
方案2:实时调用机器翻译接口
该方案无需修改现有存储结构,适合小流量、内容更新频率低的场景:
- 封装机器翻译工具类:对接你选择的机器翻译服务,封装统一的翻译方法,可传入原始内容、目标语言两个参数获取翻译结果
- 增加翻译结果缓存:为避免重复调用接口产生额外成本,将翻译结果存入缓存,缓存键可设置为
trans_{内容唯一标识}_{目标语言},缓存时长可根据内容更新频率调整 - 展示时判断调用:输出用户内容时,先判断内容原始语言和当前站点语言是否一致,不一致则调用翻译方法返回结果
现有逻辑优化提示
你当前的多语言切换逻辑只在切换语言的接口里设置了当前请求的locale,用户下次访问站点时语言配置会丢失,建议新增全局中间件统一设置语言:
- 创建中间件
app/Http/Middleware/SetLocale.php
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Session; class SetLocale { public function handle($request, Closure $next) { if (Session::has('locale')) { App::setLocale(Session::get('locale')); } return $next($request); } }
- 将中间件注册到
app/Http/Kernel.php的web中间件组中,即可每次请求自动读取session中的语言配置。
内容的提问来源于stack exchange,提问作者Lama
相关产品推荐
相关产品推荐

