如何用数据库存储的译文翻译API返回JSON的指定字段?
实时赛事数据翻译的可行实现思路
我基于Laravel+React搭建了实时比分网站,通过API获取到如下格式的赛事数据:
[ { "country_id": "6", "country_name": "Spain", "league_id": "300", "league_name": "Copa del Rey", "league_season": "2020/2021", "league_logo": "https://apiv3.apifootball.com/badges/logo_leagues/300_copa-del-rey.png", "country_logo": "https://apiv3.apifootball.com/badges/logo_country/6_spain.png" }, { "country_id": "6", "country_name": "Spain", "league_id": "302", "league_name": "La Liga", "league_season": "2020/2021", "league_logo": "https://apiv3.apifootball.com/badges/logo_leagues/302_la-liga.png", "country_logo": "https://apiv3.apifootball.com/badges/logo_country/6_spain.png" } ]
后端通过以下代码获取数据:
$APIkey='xxxxxxxxxxxxxx'; $country_id = 6; $curl_options = array( CURLOPT_URL => "https://apiv3.apifootball.com/?action=get_leagues&country_id=$country_id&APIkey=$APIkey", CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 5 ); $curl = curl_init(); curl_setopt_array( $curl, $curl_options ); $result = curl_exec( $curl ); $result = (array) json_decode($result); var_dump($result);
需求是将API返回的指定字段(如league_name)用数据库中存储的译文替换后再展示,比如把Copa del Rey替换为法语译文Coupe du Roi,以下是几种可行的实现思路:
思路1:Laravel后端提前替换后返回给前端
这是最直接的方案,在后端完成翻译替换后再把处理好的数据传给前端,前端只负责渲染即可。
实现步骤:
- 创建翻译表(如
league_translations),字段建议包含:league_id(关联API的联赛ID)、target_lang(目标语言标识,如fr代表法语)、translated_name(译文内容)。 - 获取API数据后,一次性查询所有相关联赛的翻译数据,整理为键为league_id,值为译文的关联数组。
- 遍历API返回的赛事列表,替换指定字段内容。
代码示例:
// 获取API数据(完善原代码,增加curl关闭操作) $APIkey='xxxxxxxxxxxxxx'; $country_id = 6; $curl_options = array( CURLOPT_URL => "https://apiv3.apifootball.com/?action=get_leagues&country_id=$country_id&APIkey=$APIkey", CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 5 ); $curl = curl_init(); curl_setopt_array($curl, $curl_options); $result = curl_exec($curl); curl_close($curl); // 释放curl资源 $leagues = json_decode($result, true); // 转为关联数组更易操作 // 从数据库获取目标语言(法语)的联赛翻译 $targetLang = 'fr'; $translations = DB::table('league_translations') ->where('target_lang', $targetLang) ->pluck('translated_name', 'league_id') // 直接生成键值对数组 ->toArray(); // 遍历替换联赛名称 foreach ($leagues as &$league) { // 如果存在对应翻译则替换,否则保留原名称 if (isset($translations[$league['league_id']])) { $league['league_name'] = $translations[$league['league_id']]; } } // 返回处理后的数据给前端 return response()->json($leagues);
思路2:React前端获取翻译后本地替换
如果希望后端只负责传递原始数据,翻译逻辑放在前端实现,可以采用这种方案。
实现步骤:
- Laravel提供一个接口,接收联赛ID列表,返回对应语言的翻译数据。
- React先获取原始赛事数据,提取所有联赛ID后调用翻译接口。
- 在前端组件中完成字段替换并渲染。
代码示例:
Laravel翻译接口(routes/api.php):
Route::get('/league-translations', function () { $leagueIds = request()->query('league_ids'); $targetLang = request()->query('lang', 'fr'); // 默认法语 $translations = DB::table('league_translations') ->whereIn('league_id', explode(',', $leagueIds)) ->where('target_lang', $targetLang) ->pluck('translated_name', 'league_id') ->toArray(); return response()->json($translations); });
React组件代码:
import { useEffect, useState } from 'react'; function LeagueList() { const [leagues, setLeagues] = useState([]); const [translations, setTranslations] = useState({}); useEffect(() => { // 1. 获取原始赛事数据 fetch('/api/leagues') .then(res => res.json()) .then(rawLeagues => { setLeagues(rawLeagues); // 2. 提取所有联赛ID,拼接为字符串请求翻译 const leagueIds = rawLeagues.map(league => league.league_id).join(','); return fetch(`/api/league-translations?league_ids=${leagueIds}&lang=fr`); }) .then(res => res.json()) .then(transData => { setTranslations(transData); }) .catch(err => console.error('数据请求失败:', err)); }, []); return ( <div className="league-list"> {leagues.map(league => ( <div key={league.league_id} className="league-item"> <img src={league.league_logo} alt={translations[league.league_id] || league.league_name} /> <h3>{translations[league.league_id] || league.league_name}</h3> <p>{league.country_name} | {league.league_season}</p> </div> ))} </div> ); } export default LeagueList;
思路3:结合Laravel本地化系统实现翻译
如果网站有多语言切换需求,可以结合Laravel自带的本地化(Localization)功能,将数据库中的翻译数据整合到系统本地化流程中。
实现步骤:
- 创建自定义本地化加载器,从数据库读取翻译内容。
- 注册服务提供者,让Laravel识别数据库加载器。
- 使用Laravel的
__()辅助函数完成字段替换。
代码示例:
自定义本地化服务提供者(app/Providers/DatabaseTranslationServiceProvider.php):
namespace App\Providers; use Illuminate\Support\Facades\DB; use Illuminate\Support\ServiceProvider; use Illuminate\Translation\Translator; class DatabaseTranslationServiceProvider extends ServiceProvider { public function boot() { /** @var Translator $translator */ $translator = $this->app->make('translator'); // 注册数据库类型的本地化加载器 $translator->addLoader('database', function ($locale, $group, $namespace) { return DB::table('translations') ->where('locale', $locale) ->where('group', $group) ->pluck('value', 'key') ->toArray(); }); // 加载指定分组的数据库翻译(这里分组为leagues) $translator->load('database', 'leagues', app()->getLocale()); } }
在config/app.php中注册服务提供者:
'providers' => [ // ...其他服务提供者 App\Providers\DatabaseTranslationServiceProvider::class, ],
后端替换字段:
// 获取API数据后 foreach ($leagues as &$league) { // 从数据库本地化中获取翻译,第二个参数为空数组,第三个参数指定目标语言 $translatedName = __('leagues.' . $league['league_id'], [], 'fr'); // 如果翻译存在(不是原始键名)则替换 if ($translatedName !== 'leagues.' . $league['league_id']) { $league['league_name'] = $translatedName; } }
思路4:缓存翻译数据优化性能
赛事和翻译数据不会频繁更新,可通过缓存减少数据库查询次数,提升接口响应速度。
代码示例(Laravel缓存翻译):
// 使用Laravel缓存,缓存1小时(3600秒) $translations = Cache::remember('league_translations_fr', 3600, function () { return DB::table('league_translations') ->where('target_lang', 'fr') ->pluck('translated_name', 'league_id') ->toArray(); });
当翻译数据更新时,记得清理对应缓存:
Cache::forget('league_translations_fr');
内容的提问来源于stack exchange,提问作者user22242313
相关产品推荐
相关产品推荐

