MDNのドキュメント翻訳の校正のためにmdn-textlint-jaを使ってみた。Neovimでも動かしてみた

mdn-textlint-jaを使ってみました。Neovimでも動かしてみました
2022.11.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも。CX事業本部Delivery部のえーたん(@eetann092)です。

先日、MDN Web Docsに翻訳コントリビュートした時の備忘録として記事を書きました。

Pull Requestのレビューでは、表記ルールの統一などのご指摘をいただきました。 同じようなミスを減らすために自分でtextlintのルールを設定しようかと考えていた所、mdn-textlint-jaを知りました。

本記事では、「mdn-textlint-jaの使い方」と「Neovimで使いやすくするために設定した内容」を紹介します。

↓2023年1月19日追記

以前はmongolyyさんのリポジトリmongolyy/mdn-textlint-jaにありましたが、Mozillaコミュニティのリポジトリmozilla-japan/translationに移動しました。本記事のリンク・設定も合わせて更新しております。

mdn-textlint-jaとは?

mdn-textlint-jatextlintのルール集です。MDNのドキュメント翻訳時の校正で使えるような表記ルールが追加されています。

たとえば、以下のような文章があったとします。

Kerryはコンピュータを触りました。
ゴロウはフィルタを確認しています。
Johnnyはプライバシーを尊重します。

この文章に対してmdn-textlint-jaを走らせると、以下のようにエラーが表示されます。

Editorial Guidelineに掲載されている「日本語と英数字の間には半角スペースを挿入する」「コンピュータではなくコンピュータ」のようなルールを教えてくれます。

目視では見落としがちな部分を確認できるため便利です。

使い方

READMEに書かれています。

リポジトリをcloneし、ディレクトリMDN/textlintに移動後、yarnを実行すれば準備は終わりです。

あとはyarn run lint ファイルパスで前述の画像のようにtextlintをmdn-textlint-jaのルールを使って動かせます。

Neovimで表示する

Neovimで翻訳するMarkdownファイルを開いたら、LSPのdiagnosticsとして表示されるように設定してみました。

null-ls.nvimを導入すればtextlint自体はLSPとして動きます。ただし、今回は「textlint対象となるリポジトリ(translated-content)」と「textlintを動かすためのディレクトリ(mdn-textlint-ja)」が別々の場所にあります。

そのため、cwdオプションを使ってカレントディレクトリの場所を変えることでmdn-textlint-jaを使えるようにしました。

筆者の2023年1月19日時点での設定を紹介します。シンタックスハイライト付きで見たい方は筆者のdotfilesをどうぞ。

null_ls.builtins.diagnostics.textlint.with({
  filetypes = { "markdown" },
  condition = function(utils)
    local is_mdn = utils.root_matches("translated%-content")
    local is_not_dotfiles = not utils.root_matches("dotfiles")
    return is_mdn
      or (
        is_not_dotfiles
        and utils.root_has_file({
          ".textlintrc",
          ".textlintrc.js",
          ".textlintrc.json",
          ".textlintrc.yml",
          ".textlintrc.yaml",
        })
      )
  end,
  cwd = function(params)
    local is_mdn = params.root:find("translated%-content")
    return is_mdn and vim.fn.expand("~/ghq/github.com/mozilla-japan/translation/MDN/textlint")
  end,
}),

まず、textlintをnull-ls.nvim経由で起動させるかどうかをconditionで設定しました。

  condition = function(utils)
    local is_mdn = utils.root_matches("translated%-content")

ディレクトリを判別するためにconditionではutils.root_matchescwdではparams.root:findを使いました。どちらの引数も正規表現で指定します。

ここで1つ注意です。Luaの正規表現では、-*のように「直前の項目の0回以上の繰り返し」を意味します。そのため、前に%を付けてエスケープしました。

次に、cwdで返す値の説明です。

    return is_mdn and vim.fn.expand("~/ghq/github.com/mozilla-japan/translation/MDN/textlint")

cwdで返す値は2通り設定しました。

まず、ディレクトリ名にtranslated-content含まない時にnilを返すパターンです。cwdnilを返すとカレントディレクトリがプロジェクトのルートディレクトリに設定されます。

もう一方は、ディレクトリ名にtranslated-contentを含む時にmdn-textlint-jaのパスを返すパターンです。

最後に

mdn-textlint-jaの使い方とNeovimで使いやすくするための設定を紹介しました。

ちなみに、筆者は翻訳コントリビュート対応中に実際にmdn-textlint-jaを使っており、ルールを追加するPRを投げてマージしていただきました。

参考