Monday, June 8, 2026

word2010工具栏嵌入deepseek来检测书写语法

 1、创建宏

 一、前期准备

    获取API密钥  

1. 访问 DeepSeek 官网:https://platform.deepseek.com
2. 注册/登录账号
3. 进入控制台:API Keys
4. 创建新的API密钥并保存

启用Word开发工具 

    1. 文档 → 选项 → 自定义功能区
    2. 右侧勾选「开发工具」
    3. 确定

二、创建VBA代码

    打开VBA编辑器      

1. 点击「开发工具」选项卡
2. 点击「Visual Basic」

按 Alt + F11

添加引用 

1. 工具 → 引用
2. 勾选:
   ☑ Microsoft XML, v6.0
   ☑ Microsoft VBScript Regular Expressions 5.5
3. 确定

创建新模块 

    1. 插入 → 模块
    2. 粘贴以下代码

三、完整代码

 Option Explicit

' API配置(请替换为你的真实API密钥)
Private Const API_KEY As String = "your_api_key_here"
Private Const API_URL As String = "https://api.deepseek.com/v1/chat/completions"
Private Const MODEL_NAME As String = "deepseek-chat"

' 主函数:检查选中文本的病句和错别字
Sub CheckGrammarWithDeepSeek()
    On Error GoTo ErrorHandler
    
    ' 1. 检查是否选中文本
    If Selection.Type = wdSelectionIP Then
        MsgBox "请先选择要检查的文本段落!", vbExclamation, "提示"
        Exit Sub
    End If
    
    Dim selectedText As String
    selectedText = Selection.Text
    
    ' 2. 长度保护(DeepSeek上下文约8K token,中文约4000字)
    If Len(selectedText) > 5000 Then
        If MsgBox("选中文本较长(约" & Len(selectedText) & "字符),可能影响处理速度。" & vbCrLf & _
                  "建议分批量检查。是否继续?", vbYesNo + vbQuestion, "文本过长") = vbNo Then
            Exit Sub
        End If
    End If
    
    ' 3. 显示状态栏提示
    Dim oldStatusBar As Boolean
    oldStatusBar = Application.DisplayStatusBar
    Application.DisplayStatusBar = True
    StatusBar = "正在连接AI进行语法检查..."
    
    ' 4. 创建HTTP对象
    Dim http As Object
    Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    ' 设置超时(毫秒):解析、连接、发送、接收
    http.setTimeouts 30000, 60000, 60000, 120000
    
    ' 5. 构建系统提示(内核:只报告明显必须改正的错误)
    Dim systemPrompt As String
    systemPrompt = "你是一个严格的中文校对专家。请只指出用户文本中**明显且必须改正**的错误,包括:" & vbCrLf & _
                   "1. 错别字(如同音字、形近字误用,例如:的/地/得混淆、'在'写成'再'等)" & vbCrLf & _
                   "2. 病句(语序错误、主谓搭配不当、成分缺失导致语句不通)" & vbCrLf & _
                   "3. 标点符号严重错误(如句号缺失导致句子粘连)" & vbCrLf & _
                   "4. 重复或遗漏关键词汇" & vbCrLf & vbCrLf & _
                   "忽略轻微的修辞、风格问题(如口语化表达、重复虚词等)。" & vbCrLf & _
                   "输出格式要求(严格遵守):" & vbCrLf & _
                   "如果没有错误,只输出:未发现必须改正的错误。" & vbCrLf & _
                   "如果有错误,每一条错误按照以下格式列出:" & vbCrLf & _
                   "----------------------------------------" & vbCrLf & _
                   "原文:[有错误的原句或短语]" & vbCrLf & _
                   "类型:[错别字/病句/标点/重复遗漏]" & vbCrLf & _
                   "修改建议:[正确写法]" & vbCrLf & _
                   "说明:[简短的错误解释]" & vbCrLf & _
                   "----------------------------------------" & vbCrLf & _
                   "注意:不要输出任何额外说明、开场白或结束语,直接输出检查结果。"
    
    ' 6. 构建请求体(温度设为0.2,保证结果稳定)
    Dim requestBody As String
    requestBody = "{""model"":""" & MODEL_NAME & """," & _
                  """messages"":[" & _
                  "{""role"":""system"",""content"":""" & SafeJsonEncode(systemPrompt) & """}," & _
                  "{""role"":""user"",""content"":""" & SafeJsonEncode(selectedText) & """}" & _
                  "],""temperature"":0.2,""max_tokens"":1500}"
    
    StatusBar = "正在提交请求..."
    
    ' 7. 发送请求
    With http
        .Open "POST", API_URL, False
        .setRequestHeader "Content-Type", "application/json; charset=UTF-8"
        .setRequestHeader "Authorization", "Bearer " & API_KEY
        .send requestBody
    End With
    
    StatusBar = "正在解析结果..."
    
    ' 8. 处理响应
    If http.Status = 200 Then
        Dim responseText As String
        responseText = ParseResponseImproved(http.responseText)
        
        ' 在Word中插入结果(保留原文本格式)
        Selection.Collapse Direction:=wdCollapseEnd
        Selection.InsertAfter vbCrLf & vbCrLf & "【DeepSeek语法检查结果】" & vbCrLf
        Selection.InsertAfter String(50, "=") & vbCrLf
        Selection.InsertAfter responseText
        Selection.InsertAfter vbCrLf & String(50, "=") & vbCrLf
        
        MsgBox "检查完成!", vbInformation, "成功"
    Else
        Dim errorDetail As String
        errorDetail = ExtractApiError(http.responseText)
        MsgBox "API请求失败:" & http.Status & " " & http.statusText & vbCrLf & _
               "详细信息:" & errorDetail, vbCritical, "错误"
    End If
    
    ' 9. 恢复状态栏
    StatusBar = ""
    Application.DisplayStatusBar = oldStatusBar
    Exit Sub
    
ErrorHandler:
    StatusBar = ""
    Application.DisplayStatusBar = oldStatusBar
    MsgBox "运行时错误:" & Err.Description & vbCrLf & "错误编号:" & Err.Number, vbCritical, "异常"
End Sub

' 安全JSON编码(处理所有特殊字符)
Private Function SafeJsonEncode(ByVal InputText As String) As String
    Dim result As String
    Dim i As Long
    Dim ch As String
    
    result = ""
    For i = 1 To Len(InputText)
        ch = Mid(InputText, i, 1)
        Select Case ch
            Case "\": result = result & "\\"
            Case """": result = result & "\"""
            Case vbCr: result = result & "\r"
            Case vbLf: result = result & "\n"
            Case vbTab: result = result & "\t"
            Case vbBack: result = result & "\b"
            Case vbFormFeed: result = result & "\f"
            Case Else
                ' 中文等Unicode字符无需转义,直接保留
                result = result & ch
        End Select
    Next i
    SafeJsonEncode = result
End Function

' 改进的JSON解析(处理多行、转义字符)
Private Function ParseResponseImproved(ByVal jsonText As String) As String
    On Error GoTo ParseErr
    
    ' 使用正则提取 "content" 字段的内容(支持转义引号和换行)
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    ' 模式说明:匹配 "content": " ... " ,其中内容可以包含转义符 \"
    regex.Pattern = """content""\s*:\s*""((?:[^""\\]|\\.)*?)""(?=\s*[,}])"
    regex.Global = False
    regex.MultiLine = True
    regex.IgnoreCase = False
    
    If regex.Test(jsonText) Then
        Dim matches As Object
        Set matches = regex.Execute(jsonText)
        Dim content As String
        content = matches(0).SubMatches(0)
        ' 还原转义串行
        content = UnescapeJsonString(content)
        ParseResponseImproved = Trim(content)
    Else
        ' 备用解析:查找 finish_reason 判断是否成功
        If InStr(jsonText, "finish_reason") > 0 Then
            ParseResponseImproved = "API响应解析失败,但请求可能已处理。原始片段:" & vbCrLf & Left(jsonText, 300)
        Else
            ParseResponseImproved = "无法解析API响应,请检查API密钥或网络。"
        End If
    End If
    Exit Function
    
ParseErr:
    ParseResponseImproved = "解析响应时出错:" & Err.Description & vbCrLf & "前200字符:" & Left(jsonText, 200)
End Function

' 还原JSON转义字符串
Private Function UnescapeJsonString(ByVal str As String) As String
    Dim result As String
    Dim i As Long
    
    result = ""
    i = 1
    While i <= Len(str)
        If Mid(str, i, 1) = "\" And i < Len(str) Then
            Dim nextChar As String
            nextChar = Mid(str, i + 1, 1)
            Select Case nextChar
                Case "n": result = result & vbCrLf: i = i + 2
                Case "r": result = result & vbCr: i = i + 2
                Case "t": result = result & vbTab: i = i + 2
                Case """": result = result & """": i = i + 2
                Case "\": result = result & "\": i = i + 2
                Case "u": ' 简单处理Unicode转义(如 \u4e2d),直接忽略并跳过6个字符
                    result = result & "[Unicode]": i = i + 6
                Case Else: result = result & "\": i = i + 1
            End Select
        Else
            result = result & Mid(str, i, 1)
            i = i + 1
        End If
    Wend
    UnescapeJsonString = result
End Function

' 提取API返回的错误信息
Private Function ExtractApiError(ByVal jsonText As String) As String
    On Error Resume Next
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = """message""\s*:\s*""([^""]+)"""
    If regex.Test(jsonText) Then
        ExtractApiError = regex.Execute(jsonText)(0).SubMatches(0)
    Else
        ExtractApiError = "无详细错误信息"
    End If
End Function

' 可选辅助函数:检查整个文档
Sub CheckWholeDocument()
    Selection.WholeStory
    CheckGrammarWithDeepSeek
End Sub

' 可选辅助函数:检查当前段落
Sub CheckCurrentParagraph()
    Selection.Paragraphs(1).Range.Select
    CheckGrammarWithDeepSeek
End Sub

四、另存为(另存选项) 启用宏的模板,扩展名为dotm,将此模板保存在word的templates位置。在word中,文档-选项-加载项-模板-添加,选择刚新建的模板。

五、在word中,自定义快速访问工具栏,选择宏,添加刚新建的宏到快捷访问栏。

六、用法。选中文本,电极自定义工具栏的宏命令用来检测选中文本或全文。

Monday, June 1, 2026

163 邮箱提示 Unsafe Login 的拦截问题-workbuddy中163邮箱IMAP登录

 # 登录成功后,发送 IMAP ID 命令声明客户端信息
client._simple_command('ID', '("name" "YourAppName" "version" "1.0" "vendor" "YourVendor")')
# 随后再执行 SELECT 操作
client.select_folder('INBOX')

Monday, May 18, 2026

Firefox中禁用Alt键

进入 about:config。

搜索 ui.key.menuAccessKey。

双击将数值改为 0(0 代表禁用),重启浏览器后按 Alt 键就不会再触发菜单了。

Sunday, May 10, 2026

windows下用小狼毫输入法,任务栏会卡顿的佬看这里

 1. 在Windows设置中打开 时间和语言->输入->高级键盘设置 勾选允许我为每个应用窗口使用不同的输入法。
2. 还有更改用户文档夹中weasel.custom.yaml里面的 “style/display_tray_icon” 为 false。
这样就不会卡住了。

https://linux.do/t/topic/1329559

Friday, May 8, 2026

Word中如何删除目录页的页码

 word中插入目录之后想要为每页添加页码,如果我们直接添加页码的话会出现目录是第一页,正文部分的页码是从2开始而不是1,用下面的方法就可以解决

首先让文档中的所有符号可见

第一步,把目录下的分页符删除,此时正文会跑到目录页来,通过回车使正文部分回到下一页,在插入的目录下方插入一个分节符(下一页),分节符在菜单栏下的布局里面找到分隔符,再选择分节符(从下一页开始)

第二步在正文页双击页脚,点击工具栏里的“链接到前一节”取消选中,默认是选中的,然后点击工具栏左方的页码,选择“当前位置”,“普通数字2”,正文部分的页码就出现了,如果你的页码是0,那么就点击一下工具栏中的“页码”,选择“编辑页码格式”,找到页码编号,设成1就可以了,关闭页眉和页脚设置。

最后不要忘记更新目录。

 https://www.cnblogs.com/shellpicker/p/10131118.html

Saturday, May 2, 2026

在 VirtualBox 中用iso创建新的虚拟机

一、先新建虚拟机,一般采用默认设置即可。

二、导入iso文档。

1. 打开虚拟盒子。
2、右键单击虚拟机并选择“设置”选项。
3、单击存储。
4、在“存储驱动器”部分下,选择光盘(空)项。
5、在“属性”部分下,单击光盘图标并选择选择磁盘文档按钮。
6、选择ISO文档。
7、单击打开按钮。
8、(可选)选中Live CD/DVD选项以保持 ISO 安装,即使来宾操作系统试图将其弹出。
9、(可选)选中Hot-pluggable选项以使虚拟驱动器显示为可热插拔的外围设备。
10、单击确定按钮。
完成这些步骤后,ISO 文档将挂载到虚拟机。如果这是安装媒体,安装程序将出现在访客设备上。如果将映像连接到带有操作系统的虚拟机,则该磁盘将出现在操作系统中。  如果要卸载 ISO 文档,请在“存储”设置中单击“选择磁盘文档”按钮,然后选择“从虚拟驱动器中删除磁盘”选项。  

https://www.xitongbuluo.com/jiaocheng/74579.html


virtualbox如何导入vdi格式文件生成新的虚拟机

1. 首先打开Oracle VirtualBox,进入界面,然后点击新建图标,开始创建新的虚拟机。
2. 输入虚拟机名称及存放位置,类型,版本
3. 点击下一步,输入内存大小,这里默认输入2048MB
4. 添加虚拟磁盘,这里有三个选项(不添加虚拟硬盘,现在创建虚拟硬盘,使用已有虚拟硬盘),由于我们已经有从其他地方复制过来的VDI磁盘文档,故只需选择使用已有的虚拟硬盘文档,点击创建
5. 点击左侧Anroid9虚拟机图标,启动虚拟机
6. 进入grub模式引导,选择kernel /android-9.0-42/kernel root=/dev/ram0 SRC=/adnroid-9.0-r2
7. 按b 重启(按e可以根据情况编辑)
可以将默认的grub edit> kernel /android-9.0-rc2/kernel quiet root=/dev/ram0> ....
修改为:
grub edit> kernel /android-9.0-rc2/kernel quiet root=/dev/ram0> .... nomodeset xforcevesa
8. 启动后界面如下,出现熟悉的Android界面

https://baijiahao.baidu.com/s?id=1695305523615222605&wfr=spider&for=pc

 

几个在线扫描病毒软件的网站

1、https://www.virustotal.com/zh-cn/

2、http://virscan.org/

3、https://virusscan.jotti.org/

4、http://onlinelinkscan.com/

 https://cloud.tencent.com/developer/article/1852436

Tuesday, April 28, 2026

Joplin在坚果云同步时的注意

1. 在坚果云网页根目录下新建Joplin文档夹。

2. 在Joplin客户端填写:

WebDAV URL: https://dav.jianguoyun.com/dav/Joplin

注意!!!Joplin中的J要大写。

PASS为生成的应用KEY

3. 最大并发链接数:由于坚果云的限制,只能设置为1,否则会提示Too many requests。

Friday, April 17, 2026

小狼毫直接上屏顿号

 在数据文档夹创建mypunctuator.yaml 

粘贴如下:

config_version: '1.4.1'

punctuator:
  full_shape:
    " " : { commit: " " }
    "," : { commit: , }
    "." : { commit: 。 }
    "<" : [ 《, 〈, «, ‹ ]
    ">" : [ 》, 〉, », › ]
    "/" : [ 、, /, "/", ÷ ]
    "?" : { commit: ? }
    ";" : { commit: ; }
    ":" : :
    "'" : { pair: [ "‘", "’" ] }
    "\"" : { pair: [ "“", "”" ] }
    "\\" : [ 、, \, "\\" ]
    "|" : [ ・, |, "|", "§", "¦" ]
    "`" : [ `, "`" ]
    "~" : [ 〜, "~", ~, 〰 ]
    "!" : { commit: ! }
    "@" : [ @, "@", ☯ ]
    "#" : [ #, "#", ⌘ ]
    "%" : [ %, "%", "°", "℃" ]
    "$" : [ ¥, "$", "€", "£", "¥", "¢", "¤" ]
    "^" : { commit: …… }
    "&" : [ &, "&" ]
    "*" : [ *, "*", ・, ×, ※, ❂, · ]
    "(" : (
    ")" : )
    "-" : [ -, "-" ]
    "_" : ——
    "+" : [ +, "+" ]
    "=" : [ =, "=" ]
    "[" : [ 「, 【, 〔, [ ]
    "]" : [ 」, 】, 〕, ] ]
    "{" : [ 『, 〖, { ]
    "}" : [ 』, 〗, } ]
  half_shape:
    "," : { commit: , }
    "." : { commit: 。 }
    "<" : "《"
    ">" : "》"
    "/" : "/"
    "?" : { commit: ? }
    ";" : { commit: ; }
    ":" : { commit: : }
    "'" : { pair: [ "‘", "’" ] }
    "\"" : { pair: [ "“", "”" ] }
    "\\" : "、"
    "|" : "|"
    "`" : { commit: "`" }
    "~" : ~
    "!" : { commit: ! }
    "@" : "@"
    "#" : "#"
    "%" : %
    "$" : [ ¥, "$", "€", "£", "¥", "¢", "¤" ]
    "^" : { commit: …… }
    "&" : "&"
    "*" : "*"
    "(" : { pair: [ (, ) ] }
    ")" : )
    "-" : -
    "_" : ——
    "+" : "+"
    "=" : "="
    "[" : { pair: [ 【, 】 ] }
    "]" : 】
    "{" : "{"
    "}" : "}"

key_binder:
  bindings:
    # commonly used paging keys
    - { when: composing, accept: ISO_Left_Tab, send: Page_Up }
    - { when: composing, accept: Shift+Tab, send: Page_Up }
    - { when: composing, accept: Tab, send: Page_Down }
    - { when: has_menu, accept: minus, send: Page_Up }
    - { when: has_menu, accept: equal, send: Page_Down }
    - { when: paging, accept: comma, send: Page_Up }
    - { when: has_menu, accept: period, send: Page_Down }
    - { when: paging, accept: bracketleft, send: Page_Up }
    - { when: has_menu, accept: bracketright, send: Page_Down }

在luna_pinyin_simp.custom.yaml写入:

patch:
  punctuator/import_preset: mypunctuator
  key_binder/import_preset: mypunctuator
  recognizer/patterns/punct: '^/([0-9]0?|[A-Za-z]+)$'

 https://www.cnblogs.com/Joynic/p/16409799.html

Tuesday, March 3, 2026

将小狼毫(Rime输入法)设置为通过 Ctrl +space( 空格键)切换中英文输入模式

 打开配置文档:
Rime 的配置文档通常位于 C:\Users\用户名\AppData\Roaming\Rime 文档夹下,打开其中的 default.custom.yaml 或者 luna_pinyin.custom.yaml 文档。

添加快捷键配置:
在配置文档中找到 key_binder 部分(如果没有,可以手动添加),然后插入以下内容:

yaml
复制代码

key_binder:
  bindings:
    - { when: composing, accept: "Control+space", toggle: ascii_mode }
    - { when: has_menu, accept: "Control+space", toggle: ascii_mode }

这段代码的意思是,当输入法处于「正在输入」或「有候选项菜单」时,按下 Ctrl + 空格 将在中文模式与英文模式之间切换。

重新部署输入法:
修改完成并保存文档后,右键点击输入法状态栏的图标,选择「重新部署」或「重新加载配置文档」,使更改生效。

完成后,Ctrl + 空格 就可以用来切换中英文输入模式了。

 https://www.nodeseek.com/post-166433-1

Wednesday, February 25, 2026

google搜索引擎传输url中文乱码的问题解决

 http://www.google.cn/search?q=你的中文搜索关键词&ie=GB2312&oe=GB2312&hl=zh-CN(GB2312编码)

在url末尾加上后面的尾巴就可以了。

Friday, February 20, 2026

使用 RSS 订阅 Quora

kill-the-newsletter。

简单来说,这个服务就是生成一个随机的邮件地址和对应的 RSS 地址,你可以把这个邮件地址添加到需要接收邮件的地方,比如一些 newsletter 里。然后这个服务就可以把发到这个邮箱的邮件,都转换成 RSS 来输出!

Quora 是支持添加多个邮件地址的,我们可以把上面生成的邮件地址添加到 Quora 里,邮件验证之后,将这个地址设置为 Quora 的 Primary Email,就可以收到 Quora Digest 的 RSS 了。

别忘了,验证邮件也是以 RSS 的形式输出到了订阅里。

最后,kill-the-newsletter 也是一个开源的应用,代码托管在 github,如果你有能力,也可以自己部署一个服务玩玩。

https://slarker.me/newsletter-to-rss/

Wednesday, February 4, 2026

mouselnc鼠标手势设置空白怎么办

 下载MouseInc.Settings.zip放到根目录,不要解压。

小狼毫输入法如何导入自定义短语及如何实现v模式输入

 1. 如何处理自己以前保存的自定义短语

直接打开 Excel 或 WPS表格 来处理:

    用记事本打开 phrases.ini,全选复制,粘贴到 Excel 的 A 列。

    使用 “数据” -> “分列” 功能,以 逗号(,) 和 等号(=) 为分隔符。

    你会得到三列:

        A列:缩写 (如 jq)

        B列:位置 (如 1)

        C列:内容 (如 经常)

    调整顺序: 在 D 列用公式 =C1&CHAR(9)&A1&CHAR(9)&B1 (CHAR(9) 是 Tab 键),或者手动把内容列换到最前面。

    复制结果到 custom_phrase.txt 中即可。

避坑指南

    Tab 是关键: Rime 的自定义短语文档必须用 Tab(制表符) 分隔,不能用空格,否则小狼毫会报错。

    编码: 转换出的文档一定要确认是 UTF-8 编码,Windows 默认的 ANSI 编码会导致乱码。

2. 如何启用自定义短语

 在用户文档夹中找到 default.custom.yaml 或者你正在使用的输入法皮肤配置文档(如 luna_pinyin.simple.custom.yaml)。

    在 patch: 下方添加以下配置(注意缩进):

YAML

patch:
  "engine/translators/+" :
    - table_translator@custom_phrase
  custom_phrase:
    dictionary: ""
    user_dict: custom_phrase
    db_class: stabledb
    enable_completion: false
    enable_sentence: false
    initial_quality: 1000  # 这里的数字大一些,确保短语排在第一位

第四步:重新部署

    右键点击任务栏的小狼毫图标。

    选择 “重新部署” (Deploy)。

    等待几秒钟,试着输入你定义的缩写,看看短语是否已经生效

3. 如何开启v模式?

 新建或修改luna_pinyin_simp.custom.yaml

 # luna_pinyin_simp.custom.yaml

patch:
  # 1. 内核引擎处理器
  engine/processors:
    - ascii_composer
    - recognizer
    - key_binder
    - speller
    - punctuator
    - selector
    - navigator
    - express_editor

  # 2. 翻译器顺序:确保 script_translator 在前保证中文正常
  engine/translators:
    - punct_translator
    - script_translator              
    - lua_translator@v_eng_translator
    - table_translator@custom_phrase

  # 3. 匹配规则:允许 v 后面跟字母、数字、点、@等符号
  recognizer/patterns:
    v_eng: "^v[a-zA-Z0-9.@_-]*$"

  # 4. 解决小键盘导致输入框消失的问题
  # 将小键盘数字映射为普通数字输入,避免触发“选词”逻辑
  key_binder/bindings:
    - { when: composing, accept: KP_0, send: 0 }
    - { when: composing, accept: KP_1, send: 1 }
    - { when: composing, accept: KP_2, send: 2 }
    - { when: composing, accept: KP_3, send: 3 }
    - { when: composing, accept: KP_4, send: 4 }
    - { when: composing, accept: KP_5, send: 5 }
    - { when: composing, accept: KP_6, send: 6 }
    - { when: composing, accept: KP_7, send: 7 }
    - { when: composing, accept: KP_8, send: 8 }
    - { when: composing, accept: KP_9, send: 9 }
    - { when: composing, accept: KP_Decimal, send: "." }

 新建rime.lua

 function v_eng_translator(input, seg)
  if input:match("^v[a-zA-Z0-9.@_-]*$") then  -- 只处理v+纯英文
    local eng_str = input:sub(2)  -- 去掉第一个字符v
    yield(Candidate("v_eng", seg.start, seg._end, eng_str, "英文模式"))
  end
end

修改 default.custom.yaml

添加

patch:

  engine:
    translators:
      - lua_translator@v_eng_translator