mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-11 02:12:53 +00:00
no message
This commit is contained in:
parent
a393dec0a0
commit
50a7950ccd
@ -13,6 +13,9 @@ class CreateWebSocketDialogMsgTranslatesTable extends Migration
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
if (Schema::hasTable('web_socket_dialog_msg_translates'))
|
||||
return;
|
||||
|
||||
Schema::create('web_socket_dialog_msg_translates', function (Blueprint $table) {
|
||||
$table->bigIncrements('id');
|
||||
$table->bigInteger('dialog_id')->nullable()->default(0)->comment('对话ID');
|
||||
|
||||
@ -1751,3 +1751,5 @@ WiFi签到延迟时长为±1分钟。
|
||||
你确定要删除子任务【(*)】吗?
|
||||
你确定要归档子任务【(*)】吗?
|
||||
你确定要还原归档子任务【(*)】吗?
|
||||
|
||||
请使用(*)移动端扫描二维码。
|
||||
|
||||
@ -2,92 +2,143 @@
|
||||
@error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
|
||||
|
||||
require __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
use Orhanerday\OpenAi\OpenAi;
|
||||
|
||||
require_once ("config.php");
|
||||
require_once("config.php");
|
||||
|
||||
|
||||
try {
|
||||
// 译文
|
||||
$translations = [];
|
||||
if (file_exists( "translate.json")) {
|
||||
$tmps = json_decode(file_get_contents("translate.json"), true);
|
||||
foreach ($tmps as $tmp) {
|
||||
if (!isset($tmp['key'])) {
|
||||
continue;
|
||||
}
|
||||
$translations[$tmp['key']] = $tmp;
|
||||
}
|
||||
}
|
||||
foreach (['api', 'web'] as $type) {
|
||||
// 读取文件
|
||||
$content = file_exists("original-{$type}.txt") ? file_get_contents("original-{$type}.txt") : "";
|
||||
$array = array_values(array_filter(array_unique(explode("\n", $content))));
|
||||
// 提取要翻译的
|
||||
$datas = [];
|
||||
$needs = [];
|
||||
foreach ($array as $text) {
|
||||
$text = trim($text);
|
||||
if ($tmp = json_decode($text, true)) {
|
||||
$key = key($tmp);
|
||||
$value = current($tmp);
|
||||
} else {
|
||||
$key = $value = $text;
|
||||
}
|
||||
if (isset($translations[$key])) {
|
||||
$datas[] = $translations[$key];
|
||||
} else {
|
||||
$needs[$key] = $value;
|
||||
}
|
||||
}
|
||||
$waits = array_chunk($needs, 100, true);
|
||||
// 分组翻译
|
||||
foreach ($waits as $items) {
|
||||
print_r(implode("\n", array_values($items)));
|
||||
print_r("\n\n-------------------\n\n");
|
||||
$content = implode("\n", $items);
|
||||
$open_ai = new OpenAi(OPEN_AI_KEY);
|
||||
$open_ai->setProxy(OPEN_AI_PROXY);
|
||||
|
||||
$chat = $open_ai->chat([
|
||||
'model' => 'gpt-4o',
|
||||
'messages' => [
|
||||
[
|
||||
"role" => "user",
|
||||
"content" => $content . '
|
||||
|
||||
------
|
||||
|
||||
请帮我翻译以上内容,翻译的结果尽量符合“项目任务管理系统”的使用,每行一个,按照下面的格式翻译成对应的语言,原内容放到key,zh留空,zh-CHT为繁体中文,en为英语,ko为韩语,ja为日语,de为德语,fr为法语,id为印度尼西亚语,ru为俄语。 另外要注意的是其中的(*)为占位符,翻译时不要删除,也不要翻译这个占位符。 请帮我一次性翻译完。
|
||||
|
||||
[
|
||||
{
|
||||
"key": "",
|
||||
"zh": "",
|
||||
"zh-CHT": "",
|
||||
"en": "",
|
||||
"ko": "",
|
||||
"ja": "",
|
||||
"de": "",
|
||||
"fr": "",
|
||||
"id": "",
|
||||
"ru": ""
|
||||
},
|
||||
]'
|
||||
],
|
||||
],
|
||||
'temperature' => 1.0,
|
||||
'max_tokens' => 4000,
|
||||
'frequency_penalty' => 0,
|
||||
'presence_penalty' => 0,
|
||||
]);
|
||||
|
||||
$d = json_decode($chat);
|
||||
file_put_contents('translate-gpt.md', $d->choices[0]->message->content . "\n\n\n", FILE_APPEND);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
print_r("[$type] error, " . $e->getMessage());
|
||||
// 读取所有要翻译的内容
|
||||
$array = [];
|
||||
foreach (['api', 'web'] as $type) {
|
||||
$content = file_exists("original-{$type}.txt") ? file_get_contents("original-{$type}.txt") : "";
|
||||
$array = array_merge($array, array_values(array_filter(array_unique(explode("\n", $content)))));
|
||||
}
|
||||
|
||||
// 判定是否存在translate.json文件
|
||||
if (!file_exists("translate.json")) {
|
||||
print_r("translate.json not exists");
|
||||
exit;
|
||||
}
|
||||
|
||||
$translations = []; // 翻译数据
|
||||
$regrror = []; // 正则匹配错误的数据
|
||||
$redundants = []; // 多余的数据
|
||||
$needs = []; // 需要翻译的数据
|
||||
|
||||
$tmps = json_decode(file_get_contents("translate.json"), true);
|
||||
foreach ($tmps as $tmp) {
|
||||
if (!isset($tmp['key'])) {
|
||||
continue;
|
||||
}
|
||||
$key = $tmp['key'];
|
||||
$translations[$key] = $tmp;
|
||||
if (in_array($key, $array)) {
|
||||
$count = substr_count($key, '(*)');
|
||||
if ($count > 0) {
|
||||
foreach ($tmp as $k => $v) {
|
||||
if ($k == 'zh' || $k == 'key') {
|
||||
continue;
|
||||
}
|
||||
if ($count != substr_count($v, '(*)')) {
|
||||
$regrror[$key] = $tmp;
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$redundants[$key] = $tmp;
|
||||
}
|
||||
}
|
||||
foreach ($array as $text) {
|
||||
$key = trim($text);
|
||||
if (!isset($translations[$key])) {
|
||||
$needs[$key] = $key;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($needs) > 0) {
|
||||
$waits = array_chunk($needs, 100, true);
|
||||
foreach ($waits as $index => $items) {
|
||||
if ($index > 0) {
|
||||
print_r("\n");
|
||||
}
|
||||
print_r("正在翻译:" . count($items) . "/" . count($needs) . "\n");
|
||||
$content = implode("\n", $items);
|
||||
$open_ai = new OpenAi(OPEN_AI_KEY);
|
||||
$open_ai->setProxy(OPEN_AI_PROXY);
|
||||
$chat = $open_ai->chat([
|
||||
'model' => 'gpt-4o',
|
||||
'messages' => [
|
||||
[
|
||||
"role" => "system",
|
||||
"content" => <<<EOF
|
||||
你是一个专业的翻译器,翻译的结果尽量符合“项目任务管理系统”的使用,将提供的文本按每行一个翻译成:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"key": "",
|
||||
"zh": "",
|
||||
"zh-CHT": "",
|
||||
"en": "",
|
||||
"ko": "",
|
||||
"ja": "",
|
||||
"de": "",
|
||||
"fr": "",
|
||||
"id": "",
|
||||
"ru": ""
|
||||
}
|
||||
]
|
||||
```
|
||||
key:原文本,zh:留空(不用翻译),zh-CHT:繁体中文,en:英语,ko:韩语,ja:日语,de:德语,fr:法语,id:印度尼西亚语,ru:俄语。
|
||||
另外要注意的是其中的(*)为占位符,翻译时不要删除,也不要翻译这个占位符。请直接返回文本不需要使用markdown。
|
||||
EOF,
|
||||
],
|
||||
[
|
||||
"role" => "user",
|
||||
"content" => $content,
|
||||
],
|
||||
],
|
||||
'temperature' => 1.0,
|
||||
'max_tokens' => 4000,
|
||||
'frequency_penalty' => 0,
|
||||
'presence_penalty' => 0,
|
||||
]);
|
||||
$obj = json_decode($chat);
|
||||
$arr = json_decode($obj->choices[0]->message->content, true);
|
||||
if (!$arr || !is_array($arr)) {
|
||||
print_r("翻译失败:\n");
|
||||
print_r($content . "\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($arr as $item) {
|
||||
foreach (['key', 'zh', 'zh-CHT', 'en', 'ko', 'ja', 'de', 'fr', 'id', 'ru'] as $lang) {
|
||||
if (!isset($item[$lang])) {
|
||||
print_r("翻译结果不符合规范:{$item['key']},缺少:{$lang}\n");
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
if (empty($item['key'])) {
|
||||
print_r("翻译结果不符合规范:{$item['key']},key为空\n");
|
||||
continue;
|
||||
}
|
||||
$count = substr_count($item['key'], '(*)');
|
||||
if ($count > 0) {
|
||||
foreach ($item as $k => $v) {
|
||||
if ($k == 'zh' || $k == 'key') {
|
||||
continue;
|
||||
}
|
||||
if ($count != substr_count($v, '(*)')) {
|
||||
print_r("翻译结果不符合规范:{$item['key']},正则匹配错误:{$k} => {$v}\n");
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
$item['zh'] = "";
|
||||
$translations[$item['key']] = $item;
|
||||
}
|
||||
file_put_contents("translate.json", json_encode(array_values($translations), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
|
||||
print_r("翻译完成:" . count($items) . "/" . count($needs) . "\n");
|
||||
}
|
||||
}
|
||||
|
||||
@ -59,7 +59,7 @@
|
||||
"stylus-loader": "^7.1.0",
|
||||
"tinymce": "^5.10.3",
|
||||
"tui-calendar-hi": "^1.15.1-5",
|
||||
"view-design-hi": "^4.7.0-56",
|
||||
"view-design-hi": "^4.7.0-57",
|
||||
"vite": "^2.9.15",
|
||||
"vite-plugin-file-copy": "^1.0.0",
|
||||
"vite-plugin-require": "^1.1.10",
|
||||
|
||||
@ -97,8 +97,8 @@
|
||||
|
||||
<Button type="primary" :loading="loadIng > 0 || loginJump" size="large" long @click="onLogin">{{$L(loginText)}}</Button>
|
||||
|
||||
<div v-if="loginType=='reg'" class="login-switch">{{$L('已经有帐号?')}}<a href="javascript:void(0)" @click="loginType='login'">{{$L('登录帐号')}}</a></div>
|
||||
<div v-else class="login-switch">{{$L('还没有帐号?')}}<a href="javascript:void(0)" @click="loginType='reg'">{{$L('注册帐号')}}</a></div>
|
||||
<div v-if="loginType=='reg'" class="login-switch">{{$L('已经有帐号?')}} <a href="javascript:void(0)" @click="loginType='login'">{{$L('登录帐号')}}</a></div>
|
||||
<div v-else class="login-switch">{{$L('还没有帐号?')}} <a href="javascript:void(0)" @click="loginType='reg'">{{$L('注册帐号')}}</a></div>
|
||||
</div>
|
||||
</transition>
|
||||
</div>
|
||||
@ -141,7 +141,7 @@
|
||||
</Dropdown>
|
||||
</DropdownMenu>
|
||||
</Dropdown>
|
||||
<div class="login-forgot">{{$L('忘记密码了?')}}<a href="javascript:void(0)" @click="forgotPassword">{{$L('重置密码')}}</a></div>
|
||||
<div class="login-forgot">{{$L('忘记密码了?')}} <a href="javascript:void(0)" @click="forgotPassword">{{$L('重置密码')}}</a></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -67,7 +67,7 @@
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<Tabs v-else v-model="aibotTabAction">
|
||||
<Tabs v-else v-model="aibotTabAction" class="ai-tabs">
|
||||
<TabPane label="ChatGPT" name="opanai">
|
||||
<div class="aibot-warp">
|
||||
<SystemAibot type="ChatGPT" v-if="aibotTabAction == 'opanai'" />
|
||||
|
||||
44
resources/assets/sass/pages/page-apply.scss
vendored
44
resources/assets/sass/pages/page-apply.scss
vendored
@ -319,24 +319,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
.ivu-tabs {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
margin: 0 -30px;
|
||||
|
||||
.ivu-tabs-bar {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.ivu-tabs-content {
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
.ivu-modal-wrap-ul {
|
||||
list-style-type: none;
|
||||
overflow: hidden;
|
||||
@ -421,9 +403,29 @@
|
||||
}
|
||||
|
||||
// 机器人
|
||||
.aibot-warp {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
.ai-tabs {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.ivu-tabs-bar {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.ivu-tabs-content {
|
||||
height: 0;
|
||||
flex: 1;
|
||||
|
||||
.aibot-warp {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user