Skip to content

An awesome neovim plugin written by lua which can help translate English into Chinese

License

Notifications You must be signed in to change notification settings

fni535/Trans.nvim

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

274 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Trans.nvim

插件默认词库的路径为插件目录

例如: `lazy` 用户应该在 `$HOME/.local/share/nvim/lazy/Trans.nvim`

特点

  • 使用纯 lua 编写
  • 大部分功能可以自定义:
    • 🔍 高亮
    • 👀 悬浮大小
    • 📜 排版顺序
    • 💬 弹窗大小
    • 🎉 舒服窗口动画
    • 更多可以查看配置
  • 离线在线翻译的支持
  • 支持显示:
    • 🌟 柯林斯星级
    • 📚 牛津 3000 词汇
    • 🇨🇳 中文翻译
    • 🇺🇸 英文翻译 (不是英译中, 而是用英文解释)
    • 🌱 词根
    • etc
  • 支持平滑动画
  • 支持 normalvisual模式

    不支持 visual-block mode

  • 本地词库单词量: 430w

屏幕截图

演示

可以点开声音查看离线自动发音

离线查询

normal_demo.mp4

在线查询演示 (有道)

online_query.mp4

使用在线查询需要配置相应的 app_id 和 app_passwd

配置说明见: wiki

主题

如果你有更美观或者更适合的配色, 欢迎提 PR
主题配色在: lua/Trans/theme.lua文件中,你只需要添加你主题的表就可以了

  • default default

  • dracula dracula

  • tokyonight tokyonight

安装

安装之前, 首先需要明确本插件的依赖:

  • ECDICT: 插件所用的离线单词数据库
  • sqlite.lua: 操作数据库所用的库
  • sqlite3: 数据库
Packer.nvim
use {
    'JuanZoran/Trans.nvim',
    run = function() require('Trans').install() end, -- 自动下载使用的本地词库
    requires =  'kkharji/sqlite.lua', ,
    -- 如果你不需要任何配置的话, 可以直接按照下面的方式启动
    config = function ()
        require'Trans'.setup{
            -- your configuration here
        }
    end
}

如果你想要使用 Packer 的惰性加载,这里有一个例子

use {
    "JuanZoran/Trans.nvim",
    keys = {
        { {'n', 'x'}, 'mm' }, -- 换成其他你想用的key即可
        { {'n', 'x'}, 'mk' },
        { 'n', 'mi' },
    },
    run = function() require('Trans').install() end, -- 自动下载使用的本地词库
    requires = { 'kkharji/sqlite.lua',  },
    config = function()
        require("Trans").setup {
            -- your configuration here
        }
        vim.keymap.set({"n", 'x'}, "mm", '<Cmd>Translate<CR>') -- 自动判断visual 还是 normal 模式
        vim.keymap.set({'n', 'x'}, 'mk', '<Cmd>TransPlay<CR>') -- 自动发音选中或者光标下的单词
        vim.keymap.set('n', 'mi', '<Cmd>TransInput<CR>')
    end
}
Lazy.nvim
    {
        "JuanZoran/Trans.nvim",
        build = function () require'Trans'.install() end,
        keys = {
        -- 可以换成其他你想映射的键
            { 'mm', mode = { 'n', 'x' }, '<Cmd>Translate<CR>', desc = '󰊿 Translate' },
            { 'mk', mode = { 'n', 'x' }, '<Cmd>TransPlay<CR>', desc = ' Auto Play' },
            -- 目前这个功能的视窗还没有做好,可以在配置里将view.i改成hover
            { 'mi', '<Cmd>TranslateInput<CR>', desc = '󰊿 Translate From Input' },
        },
        dependencies = { 'kkharji/sqlite.lua', },
        opts = {
            -- your configuration there
        }
    }

注意事项:

  • 下载词典的过程中, 需要能够 流畅的访问github下载

    如果下载出现问题, 正常是会自动下载

    词库文件压缩包大小为: 281M
    解压缩后的大小大概为: 1.2G

  • 安装后如果不能正常运行, 清尝试运行 checkhealth Trans

  • auto_play 的使用:

    • Linux 需要安装festival

      sudo apt-get install festival festvox-kallpc16k

      如果你想要设置音色,发音可以访问: Festival 官方
      可以选择英音、美音、男声、女声

    • Termux 需要安装termux-api

    • Mac 使用系统的say命令

    • Windows 使用原生的 Powershell 命令, 感谢PR

  • title的配置,只对neovim 0.9+版本有效

Festival配置(仅针对linux用户) - 配置文件 - 全局配置: `/usr/share/festival/siteinit.scm` - 用户配置: `~/.festivalrc`
  • 更改声音

    • 在 festival 的 voices 文件内建立自己的文件夹

      一般其默认配置目录在/usr/share/festival/voices

      示例:

      sudo mkdir /usr/share/festival/voices/my_voices

    • 下载想要的 voices 文件并解压

      可能需要 

      • 试听在这里)
      • 下载在这里)

        假设下载的文件在Downloads文件夹, 下载的文件为:festvox_cmu_us_aew_cg.tar.gz

      示例:

      cd ~/Downloads && tar -xf festvox_cmu_us_aew_cg.tar.gz

    • 将音频文件拷贝到 festival 文件夹 示例:

      sudo cp -r festival/lib/voices/us/cmu_us_aew_cg/ /usr/share/festival/voices/my_voices/

    • 在配置文件中设置默认的声音 示例:

      加入(set! voice_default voice_cmu_indic_hin_ab_cg)到配置文件

    • 安装完成

  • 相关说明网站

    可能需要 

配置

详细见wiki: 基本配置说明

默认配置
default_conf = {
    ---@type string the directory for database file and password file
    dir      = require 'Trans'.plugin_dir,
    debug    = true,
    ---@type 'default' | 'dracula' | 'tokyonight' global Trans theme [see lua/Trans/style/theme.lua]
    theme    = 'default', -- default | tokyonight | dracula
    strategy = {
        ---@type { frontend:string, backend:string | string[] } fallback strategy for mode
        default = {
            frontend = 'hover',
            backend = '*',
        },
    },
    ---@type table frontend options
    frontend = {
        ---@class TransFrontendOpts
        ---@field keymaps table<string, string>
        default = {
            query     = 'fallback',
            border    = 'rounded',
            title     = vim.fn.has 'nvim-0.9' == 1 and {
                    { '',       'TransTitleRound' },
                    { '󰊿 Trans', 'TransTitle' },
                    { '',       'TransTitleRound' },
                } or nil, -- need nvim-0.9+
            auto_play = true,
            ---@type {open: string | boolean, close: string | boolean, interval: integer} Hover Window Animation
            animation = {
                open = 'slid', -- 'fold', 'slid'
                close = 'slid',
                interval = 12,
            },
            timeout   = 2000,
        },
        ---@class TransHoverOpts : TransFrontendOpts
        hover = {
            ---@type integer Max Width of Hover Window
            width             = 37,
            ---@type integer Max Height of Hover Window
            height            = 27,
            ---@type string -- see: /lua/Trans/style/spinner
            spinner           = 'dots',
            ---@type string
            fallback_message  = '{{notfound}} 翻译超时或没有找到相关的翻译',
            auto_resize       = true,
            split_width       = 60,
            padding           = 10, -- padding for hover window width
            keymaps           = {
                -- INFO : No default keymaps anymore, please set it yourself
                -- pageup       = '<C-u>',
                -- pagedown     = '<C-d>',
                -- pin          = '<leader>[',
                -- close        = '<leader>]',
                -- toggle_entry = '<leader>;',

                -- play         = '_', -- Deprecated
            },
            ---@type string[] auto close events
            auto_close_events = {
                'InsertEnter',
                'CursorMoved',
                'BufLeave',
            },
            ---@type table<string, string[]> order to display translate result
            order             = {
                default = {
                    'str',
                    'translation',
                    'definition',
                },
                offline = {
                    'title',
                    'tag',
                    'pos',
                    'exchange',
                    'translation',
                    'definition',
                },
                youdao = {
                    'title',
                    'translation',
                    'definition',
                    'web',
                },
            },
            icon              = {
                -- or use emoji
                list        = '', -- ● | ○ | ◉ | ◯ | ◇ | ◆ | ▪ | ▫ | ⬤ | 🟢 | 🟡 | 🟣 | 🟤 | 🟠| 🟦 | 🟨 | 🟧 | 🟥 | 🟪 | 🟫 | 🟩 | 🟦
                star        = '', -- ⭐ | ✴ | ✳ | ✲ | ✱ | ✰ | ★ | ☆ | 🌟 | 🌠 | 🌙 | 🌛 | 🌜 | 🌟 | 🌠 | 🌌 | 🌙 |
                notfound    = '󰆆 ', --❔ | ❓ | ❗ | ❕|
                yes         = '', -- ✅ | ✔️ | ☑
                no          = '', -- ❌ | ❎ | ✖ | ✘ | ✗ |
                cell        = '', -- ■  | □ | ▇ | ▏ ▎ ▍ ▌ ▋ ▊ ▉
                web         = '󰖟', --🌍 | 🌎 | 🌏 | 🌐 |
                tag         = '',
                pos         = '',
                exchange    = '',
                definition  = '󰗊',
                translation = '󰊿',
            },
        },
    },
}

快捷键绑定

示例:

示例中展示, 将mm映射成快捷键

vim.keymap.set('n', 'mi', '<Cmd>TranslateInput<CR>')
vim.keymap.set({'n', 'x'}, 'mm', '<Cmd>Translate<CR>')
vim.keymap.set({'n', 'x'}, 'mk', '<Cmd>TransPlay<CR>') -- 自动发音选中或者光标下的单词

窗口快捷键

require 'Trans'.setup {
    frontend = {
        hover = {
            keymaps = {
                -- pageup       = 'whatever you want',
                -- pagedown     = 'whatever you want',
                -- pin          = 'whatever you want',
                -- close        = 'whatever you want',
                -- toggle_entry = 'whatever you want',
            },
        },
    },
    }
}

当窗口没有打开的时候, key 会被使用vim.api.nvim_feedkey来执行

高亮组

所有主题可见 lua/Trans/style/theme.lua

默认主题
TransWord = {
    fg = '#7ee787',
    bold = true,
}
TransPhonetic = {
    link = 'Linenr'
}
TransTitle = {
    fg = '#0f0f15',
    bg = '#75beff',
    bold = true,
}
TransTitleRound = {
    fg = '#75beff',
}
TransTag = {
    -- fg = '#e5c07b',
    link = '@tag'
}
TransExchange = {
    link = 'TransTag',
}
TransPos = {
    link = 'TransTag',
}
TransTranslation = {
    link = 'TransWord',
}
TransDefinition = {
    link = 'Moremsg',
}
TransWin = {
    link = 'Normal',
}
TransBorder = {
    fg = '#89B4FA',
}
TransCollins = {
    fg = '#faf743',
    bold = true,
}
TransFailed = {
    fg = '#7aa89f',
}
TransWaitting = {
    link = 'MoreMsg'
}
TransWeb = {
    link = 'MoreMsg',
}

声明

感谢

贡献

更新比较频繁, 文档先鸽了 (wiki 写了一小部分
如果你想要参加这个项目, 可以提 issue, 我会把文档补齐

从 v1 (main)分支迁移

wiki

待办 (画大饼)

  • 快捷键定义
  • 自动读音
  • 在线多引擎异步查询
  • 句子翻译 | 中翻英 的支持
  • 迁移文档
  • 多风格样式查询
  • 变量命名的支持
  • 历史查询结果保存
  • 翻译结果替换

项目情况

Star History Chart

About

An awesome neovim plugin written by lua which can help translate English into Chinese

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Lua 99.8%
  • Other 0.2%