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

如何用数据库存储的译文翻译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后端提前替换后返回给前端

这是最直接的方案,在后端完成翻译替换后再把处理好的数据传给前端,前端只负责渲染即可。

实现步骤:

  1. 创建翻译表(如league_translations),字段建议包含:league_id(关联API的联赛ID)、target_lang(目标语言标识,如fr代表法语)、translated_name(译文内容)。
  2. 获取API数据后,一次性查询所有相关联赛的翻译数据,整理为键为league_id,值为译文的关联数组。
  3. 遍历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前端获取翻译后本地替换

如果希望后端只负责传递原始数据,翻译逻辑放在前端实现,可以采用这种方案。

实现步骤:

  1. Laravel提供一个接口,接收联赛ID列表,返回对应语言的翻译数据。
  2. React先获取原始赛事数据,提取所有联赛ID后调用翻译接口。
  3. 在前端组件中完成字段替换并渲染。

代码示例:

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)功能,将数据库中的翻译数据整合到系统本地化流程中。

实现步骤:

  1. 创建自定义本地化加载器,从数据库读取翻译内容。
  2. 注册服务提供者,让Laravel识别数据库加载器。
  3. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:52:34