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

Laravel中如何使用翻译API实现商品字段动态翻译功能

问题1:示例代码存放位置
  • 不建议直接存放在Model或Controller中:Model层职责仅为处理数据持久化相关逻辑,第三方API调用不属于该范畴;直接写在Controller会导致代码冗余,多处需要翻译功能时需要重复编写。
  • 最佳实践:将翻译API调用逻辑封装为独立的服务类,新手阶段也可先封装为Controller的公共方法或模型访问器,后续再重构优化。
  • 注意不要硬编码API密钥、地址等配置,统一放到.env文件中管理,Laravel会自动加载环境变量。
问题2:动态翻译视图变量实现方案

你可以通过模型访问器的方式实现最小改动的动态翻译,步骤如下:

步骤1:新增配置文件

首先在config目录下新建translate.php配置文件,内容如下:

<?php
return [
    'url' => env('TRANSLATE_API_URL', ''),
    'key' => env('TRANSLATE_API_KEY', ''),
    'secret' => env('TRANSLATE_API_SECRET', ''),
    'name' => env('TRANSLATE_API_NAME', ''),
];

然后在项目根目录的.env文件中添加对应的配置项,填入你的API参数:

TRANSLATE_API_URL=你的API根地址
TRANSLATE_API_KEY=你的API Key
TRANSLATE_API_SECRET=你的API Secret
TRANSLATE_API_NAME=你的登录ID

步骤2:安装依赖

你用到的OAuth2客户端需要先通过Composer安装,在项目根目录执行命令:

composer require league/oauth2-client

步骤3:新增模型访问器

打开app/Models/Product.php文件,添加如下代码:

use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;

// ... 模型原有代码

public function getTranslatedNameAttribute()
{
    // 缓存翻译结果,避免重复调用API
    $cacheKey = 'prod_trans_' . $this->id . '_name';
    if (Cache::has($cacheKey)) {
        return Cache::get($cacheKey);
    }

    $provider = new \League\OAuth2\Client\Provider\GenericProvider([
        'clientId' => config('translate.key'),
        'clientSecret' => config('translate.secret'),
        'redirectUri' => '',
        'urlAuthorize' => '',
        'urlAccessToken' => config('translate.url') . '/oauth2/token.php',
        'urlResourceOwnerDetails' => '',
    ]);

    try {
        $accessToken = $provider->getAccessToken('client_credentials');
        $params = [
            'access_token' => $accessToken->getToken(),
            'key' => config('translate.key'),
            'api_name' => '你对应的翻译接口标识',
            'api_param' => '',
            'name' => config('translate.name'),
            'type' => 'xml',
            'text' => $this->name, // 传入当前商品的原名称
        ];

        $request = $provider->getAuthenticatedRequest(
            'POST',
            config('translate.url') . '/api/?' . http_build_query($params),
            $accessToken
        );
        $response = $provider->getResponse($request);
        $data = $response->getBody()->getContents();
        
        // 解析XML返回结果,根据实际API返回结构调整解析逻辑
        $xml = simplexml_load_string($data);
        $translatedName = (string)$xml->trans_result ?? $this->name;

        // 永久缓存翻译结果,可按需调整有效期
        Cache::forever($cacheKey, $translatedName);
        return $translatedName;
    } catch (\Exception $e) {
        // 接口调用失败时返回原名称,不影响页面展示
        Log::error('商品翻译失败,ID:' . $this->id . ',错误信息:' . $e->getMessage());
        return $this->name;
    }
}

步骤4:修改视图代码

将视图文件中原{{ $pro->name }}替换为{{ $pro->translated_name }}即可,修改后代码如下:

@foreach($user->products as $pro)
@if($pro->category_id == 1)
    <div class="menu"><div class="menu-description">
        <div class="title-price">
            <h2>{{ $pro->translated_name }}</h2>
            <h2>¥{{ $pro->price }}</h2>
        </div>
        <div>
            {{ $pro->description }}
        </div>                                  
    </div>
@endif
@endforeach

优化建议

如果页面展示的商品数量较多,建议在Controller查询商品列表后批量调用翻译接口,避免出现N+1的API调用问题,大幅提升页面加载速度。

内容的提问来源于stack exchange,提问作者toyop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:42:02