mlang

mlang.txt 适用于 Vim 9.2 版本。 最近更新: 2025年3月 VIM 参考手册 by Bram Moolenaar 译者: jwdu <[email protected]>、 iCrazy <[email protected]> 多语言特性 multilang multi-lang 本节介绍如何在 Vim 中使用多种语言的信息和菜单。关于编辑多字节文本,请参看 multibyte 。 基本用法请参看用户手册 usr_45.txt 。 1. 信息 multilang-messages 2. 菜单 multilang-menus 3. 脚本 multilang-scripts 关于多语言的帮助,请参看 help-translated{仅当编译时加入 +multi_lang 特性才有效}

1. 信息 multilang-messages

Vim 从环境变量中获取当前 locale 信息。多数情形下,这意味着 Vim 会使用用户首选 的语言,除非该语言不可用。 要了解当前系统支持的 locale 列表,可在以下路径之一 (用于 Unix) 下查看: /usr/lib/locale /usr/share/locale 不幸的是,locale 区分大小写。还要注意 "-" 和 "_" 不要用混了。 (译者注: Windows 上,简体/繁体中文对应语言是 chinese_china 和 chinese_taiwan, 它们在内部被翻译为 zh_CN 和 zh_TW。换而言之,可以用 :language chinese_china " 不能直接用 zh_CN :echo v:lang zh_CN 这一翻译机制目前来自硬编码,因而看来没有 UTF-8 对应形式的支持。) :lan :lang :language E197 :lan[guage] :lan[guage] mes[sages] :lan[guage] cty[pe] :lan[guage] tim[e] :lan[guage] col[late] 显示当前语言 (即 locale)。 使用 "messages" 参数时,会显示用于显示消息的语言。 术语: LC_MESSAGES。 使用 "ctype" 参数时,会显示用于字符编码的语言。 术语: LC_CTYPE。 使用 "time" 参数时,会显示用于 strftime() 的语言。 术语: LC_TIME。 使用 "collate" 参数,会显示用于排序规则的语言。 术语: LC_COLLATE。 参数省略时,显示当前语言的全部组成部分 (返回格式因系统 而异)。 也可通过变量 v:langv:ctypev:collatev:lc_time 来获得用于各种用途的当前语言。 :lan[guage] {name} :lan[guage] mes[sages] {name} :lan[guage] cty[pe] {name} :lan[guage] tim[e] {name} :lan[guage] col[late] {name} 设置当前语言 (即 locale) 为 {name}{name} 的 POSIX 格式是: language[_territory][.encoding] 此处的 {name} 必须是系统上的合法语言。一些系统接受像 "en" 或 "en_US" 这样的别名,但有一些系统只接受像 "en_US.ISO_8859-1" 这样的完整名称。在 Unix 系统上,可 用以下命令查看当前系统支持的 locale: :!locale -a 通过 "messages" 参数,可以设置用于显示消息的语言。该语 言可以不同于当前语言,如在编辑日文文本时使用英文消息。 此值会更新 $LC_MESSAGES。 通过 "ctype" 参数,可以设置用作字符编码的语言。这会影 响 Vim 所链接的库。通常该值应设为当前 'encoding' 值或 "C"。此值会更新 $LC_CTYPE。 通过 "time" 参数,可以设置用于时间和日期消息的语言。这 会影响到 strftime()。此值会更新 $LC_TIME。 通过 "collate" 参数,可以设置用于排序规则的语言。从而 影响字符的排序方式。此值会更新 $LC_COLLATE。 参数省略时,将同时设置以上所有语言类别,另外还会更新 $LANG。 如果可用,LC_NUMERIC 总会被设为 "C",以确保浮点数使用 '.' 作为十进制小数点。 本命令会影响所有依赖语言的功能 (部分消息,时间和日期的 格式)。并非所有系统都完全支持这些设置。 如果设置失败,会返回出错信息。设置成功时,将不会有任何 信息。例如: :language 当前的 语言: C :language de_DE.ISO_8859-1 :language mes 当前的 messages 语言: de_DE.ISO_8859-1 :lang mes en MS-WINDOWS 消 息 翻 译 win32-gettext 如果使用自安装的 .exe 文件,消息翻译通常会直接生效。如果有问题,可能由于系统找 不到 libintl.dll 文件。该文件可从以下网站获取: http://sourceforge.net/projects/gettext 或: https://mlocati.github.io/gettext-iconv-windows/ 这里也包含了 xgettext,msgformat 以及其它工具。 libintl.dll 应该放在 (g)vim.exe 所在的目录,或者环境变量 PATH 所指定的目录之 一。如果找不到,Vim 也会尝试寻找备用名 "libintl-8.dll" 和 "intl.dll"。 消息数据文件 (vim.mo) 应放在 "$VIMRUNTIME/lang/xx/LC_MESSAGES",这里 "xx" 是所 用语言的缩写 (通常是两个字母,但有例外,如简体或繁体中文会是 zh_CN 或 zh_TW)。 如果希望自行翻译消息,需要生成 .po 文件,并将其转化为 .mo 文件。具体操作请获取 Vim 的源代码并阅读 "src/po/README.txt" 文件。 如果不想使用自动选择的语言,可将 $LANG 变量设为用户首选语言。要关闭语言翻译, 可将其设为 "en"。 :let $LANG = 'ja' (Windows 相关的帮助文本由 Muraoka Taro 完成)

2. 菜单 multilang-menus

基本用法请参看 45.2 ,尤其是 'langmenu' 的设置部分。 注意 即使菜单项的翻译已经完成,新改动的菜单项可能仍显示为英文。请联系翻译维护 者,并请求更新菜单项翻译。可在 "$VIMRUNTIME/lang/menu_<lang>.vim" 中找到翻译者 的姓名和电邮地址。 要设置用于菜单的字体 (或字体集),可用 :highlight 命令。例如: :highlight Menu font=k12,r12 LOCALE 的 别 名 不幸的是,即使使用相同的语言和编码,在不同系统上对应的 locale 名也可能不同。如 果菜单翻译使用的语言不符合预期,请检查以下命令的输出: echo v:lang 现在,请检查 "$VIMRUNTIME/lang" 目录,确认是否存在使用相近语言的菜单翻译文件。 注意 符号 "-" 和 "_" 的区别也可能导致文件无法找到!此外,"iso8859-1" 和 "iso_8859-1" 的差异常常也会引发问题。所幸的是,Vim 会将所有名称统一转换为小 写。因此无需担心大小写差异。为避免对空格进行转义,空格会被替换为下划线。 如果发现所需的菜单翻译文件使用不同语言名,可在用户运行时目录下创建新脚本文件, 以载入正确的菜单翻译文件。该脚本的文件名应该是: ~/.vim/lang/menu_<v:lang>.vim 'runtimepath' 选项给出会被搜索的运行时目录。在该脚本文件中,添加一条命令以载入 使用其他名称的菜单文件: runtime lang/menu_<其他语言>.vim 翻 译 菜 单 如果希望自行翻译菜单,可用 :menutrans 命令,说明见下。推荐将同一语言的所有翻 译命令集中放进一个 Vim 脚本文件。对于尚未完成翻译的语言,欢迎考虑成为其维护 者,以便让翻译成果惠及所有 Vim 用户。为此,请发电邮给 Vim 的维护者: <[email protected]>。 :menut :menutrans :menutranslate :menut[ranslate] clear 清除所有的菜单翻译。 :menut[ranslate] {english} {mylang} 将菜单名称 {english} 翻译成 {mylang}。"&" 和 "<Tab>" 这样的特殊字符也必须都包括进去。和其它 :menu 命令一 样,空格和句点都需要用反斜杠转义。 忽略 {english} 中的大小写。 要查看示例,可参阅 $VIMRUNTIME/lang 目录。 要检验翻译结果,首先需要清除所有菜单。如果不想重新启动 Vim,可用: :source $VIMRUNTIME/delmenu.vim :source <新-菜单-文件> :source $VIMRUNTIME/menu.vim 菜单路径的每个部分会单独进行翻译。例如: 假定 "Help" 被翻译为 "帮助", "Overview" 被翻译为 "总览",那么 "Help.Overview" 会被翻译为 "帮助.总览"。

3. 脚本 multilang-scripts

在 Vim 脚本中,可通过 v:lang 变量获取当前语言 (locale)。缺省值是 "C",或取自 环境变量 $LANG。 下例展示了如何以简单方式使用该变量,使消息能够根据用户的语言偏好进行调整: :if v:lang =~ "zh_CN" : echo "早上好" :else : echo "Good morning" :endif vim:tw=78:sw=4:ts=8:noet:ft=help:norl: