在 Yii 2.0 中实现国际化,翻译英文描述中的一部分为中文描述(微信接口返回的英文信息)

1、在请求微信接口时,返回码:45028,返回的英文信息:has no masssend quota rid: 6103df2e-1505ba73-0eb14e1c。如图1

图1

{
  "errcode": 45028,
  "errmsg": "has no masssend quota rid: 6103df2e-1505ba73-0eb14e1c"
}

2、代码实现如下

$responseData = $wxServiceApi::wxMessageSendAll($requestData);
if (!isset($responseData['msg_id'])) {
    $errcode = array_key_exists('errcode',$responseData)?$responseData['errcode']:205100;
    throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '205100'), ['error_code' => $errcode, 'error_msg' => $responseData['errmsg']])), 205100);
}

3、计划将错误信息:has no masssend quota rid: 6103df2e-1505ba73-0eb14e1c 翻译为:没有群发配额。rid: 6103df2e-1505ba73-0eb14e1c。如图2

图2

4、添加文件 common/messages/en-US/wx.php、common/messages/zh-CN/wx.php、wx/messages/en-US/wx.php、wx/messages/zh-CN/wx.php。如图3

图3


common/messages/en-US/wx.php
<?php
return [
];

common/messages/zh-CN/wx.php

<?php
return [
    'has no masssend quota' => '没有群发配额(订阅号为每天 1 次,服务号为每月 4 次)。',
    'invalid content' => '无效内容(内容中包含音频)。',
];

wx/messages/en-US/wx.php

<?php
$commonMessages = require __DIR__ . '/../../../common/messages/en-US/wx.php';
$messages = [
];
return $commonMessages + $messages;

wx/messages/zh-CN/wx.php

<?php
$commonMessages = require __DIR__ . '/../../../common/messages/zh-CN/wx.php';
$messages = [
];
return $commonMessages + $messages;

5、代码实现如下。其中代码:substr($responseData[‘errmsg’], 0, $pos) 的结果为:has no masssend quota。其中代码:substr($responseData[‘errmsg’], $pos) 的结果为: rid: 6103df2e-1505ba73-0eb14e1c。将:has no masssend quota 翻译为:没有群发配额。后,再拼接上: rid: 6103df2e-1505ba73-0eb14e1c。

$responseData = $wxServiceApi::wxMessageSendAll($requestData);
if (!isset($responseData['msg_id'])) {
    $errcode = $responseData['errcode'] ?? 205100;
    $pos = strpos($responseData['errmsg'], ' rid:');
    $errorMsg = Yii::t('wx', substr($responseData['errmsg'], 0, $pos)) . substr($responseData['errmsg'], $pos);
    throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '205100'), ['error_code' => $errcode, 'error_msg' => $errorMsg])), 205100);
}

6、针对返回的英文信息:invalid content hint: [pzRHda0286d228] rid: 61041ffe-5cefd269-6c9611ff,完善后的代码如下。根源在于源语言的消息不支持模糊匹配。

$responseData = $wxServiceApi::wxMessageSendAll($requestData);
if (!isset($responseData['msg_id'])) {
    $errcode = $responseData['errcode'] ?? 205100;
    $errorMsg = '';
    $pos = strpos($responseData['errmsg'], ' hint:');
    if ($pos === false) {
        $pos = strpos($responseData['errmsg'], ' rid:');
    }
    if ($pos !== false) {
        $errorMsg = Yii::t('wx', substr($responseData['errmsg'], 0, $pos)) . substr($responseData['errmsg'], $pos);
    }
    throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '205100'), ['error_code' => $errcode, 'error_msg' => $errorMsg])), 205100);
}

7、测试翻译结果,has no masssend quota rid: 610a50c5-26966176-7cceb46e 已经被翻译为:没有群发配额(订阅号为每天 1 次,服务号为每月 4 次)。rid: 610a50c5-26966176-7cceb46e。符合预期。如图4

图4

8、测试翻译结果,invalid content hint: [dN7TKA0474d139] rid: 610a5a7a-5907e6c6-270b8278 已经被翻译为:无效内容(内容中包含音频)。 hint: [dN7TKA0474d139] rid: 610a5a7a-5907e6c6-270b8278。符合预期。如图5

图5

9、由于 invalid image size 还未被添加至语言包中,因此:invalid image size hint: [cl_6Oa0457mp13] rid: 6103c6d0-481a4bed-73e7120a 保持原样。符合预期。

<?php
return [
    'has no masssend quota' => '没有群发配额(订阅号为每天 1 次,服务号为每月 4 次)。',
    'invalid content' => '无效内容(内容中包含音频)。',
    'invalid image size' => '图片尺寸太大(大小必须在10MB以下)。',
];

11、测试翻译结果,invalid image size hint: [flp8Ba0298w689] rid: 610a6969-72bb79c0-4b069755 已经被翻译为:invalid image size hint: [flp8Ba0298w689] rid: 610a6969-72bb79c0-4b069755。蓝框中是翻译前的英文信息,红框中是翻译后的中文信息。符合预期。如图6

图6

永夜