AIを活用してドキュメント翻訳から始めるOSSコントリビューション

## 初めてのOSS活動

新卒でWebエンジニアになって以来、OSS（オープンソースソフトウェア）にコミットしている人たちをカッコいいと思いつつ、どこか自分には関係ない他人事のように捉えていました。

というのも、自分は普段OSSを利用していても、バグも見つけられなければ、機能の改善案も浮かんできません。
それに、コントリビューションというとなんとなく敷居が高く、相当の修練が必要なのでは、とも感じていました。
OSS活動は、一部のスーパーエンジニアがやることで、自分にとっては夢のまた夢...。そんな風に考えていました。

ところがある日、このブログのテーマである[hugo-profile](https://github.com/gurusabarish/hugo-profile/pull/183)をダークテーマにすると、フッターのGithubアイコンの色が変化せず見づらい、という問題を発見しました。
これは良い機会だと思い、コントリビューションの方法を調べて[プルリクエスト](https://github.com/gurusabarish/hugo-profile/pull/183)を出したところマージされました。

![my-first-pr.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/6378e73d-7ff8-4559-93ea-82c15708a29c.jpeg)

そこからOSS活動の楽しさに目覚めました。
ボランティア活動のような体験ができる、という表現が妥当なのか分かりませんが、とにかく自分が何かに「貢献」しているというような感覚を得られるのです。
スーパーエンジニアでなくても、小さなことからOSS活動は始められるのです。

これを機に、微力ながらいくつかプルリクエストを出していきました。

## 初心者におすすめなのは翻訳

その中でも、初心者にとって一番手を出しやすいのでは、と思ったのが、ドキュメントの翻訳です。

グローバル化する世の中で、日本語版ドキュメントが存在しないライブラリは数多く存在します。
一方、ChatGPTを始めとする生成AIや、CursorなどのAIを活用したエディタ、DeepLなど高性能な翻訳機の台頭により、誰でも翻訳活動に参加しやすい状況が整ってきています。
翻訳であれば、バグ修正や機能追加に比べて敷居が低く、比較的手軽に参加できます。

もちろん最低限の語学力は必要になってきますが、前述したAIや翻訳機といったツールを使うことで、かなり楽に作業できます。

OSS活動に参加してみたいけど、敷居が高そうと感じている方は、まずは翻訳から貢献してみるのはいかがでしょうか？

## 実際に日本語版ドキュメントのプルリクを出すまでの過程

最近、外国語版しか存在しなかったドキュメントに日本語版を追加してきたので、その過程で得た経験や注意点などを共有したいと思います。

翻訳したのは、[MyBatis](https://mybatis.org/mybatis-3/ja/)を拡張した[MyBatis-Plus](https://github.com/baomidou/mybatis-plus)というライブラリの[ドキュメント](https://www.baomidou.com/)です。
中国の方々によって作成されたライブラリのため、ドキュメントも中国語しかありませんでした。

大体3週間で約50ページ、1万3000行以上を翻訳し、マージされました。
平日は大体1時間ほど、休日は4-5時間ほど作業していました。
大きめの規模のライブラリであることを考えると、中々の作業スピードだと思うのですが、これは別に自分の語学力が卓越しているからではありません。
後述するように、Cursorを使うことで、最低限の語学力さえあれば爆速で翻訳作業を進めることができるのです。
その点も併せて解説していきます。

### 1. 外国語のままになっているOSSのドキュメントを探す

当然ですが、まずは翻訳する対象が必要です。
今まで業務や個人で使用してきたライブラリを振り返ってみるのが手っ取り早いと思います。
また、Githubの[Explore](https://github.com/explore)を眺めてみるのも良いでしょう。

ちなみにMyBatis-Plusについては、現在お世話になっている会社で使用していたというのがきっかけです。

### 2. 翻訳プロジェクトが存在するか確認

当該ドキュメントのGithubページにアクセスしたら、既に日本語訳のプロジェクトが存在していないか確認しましょう。
存在していれば手順4に、していなければ手順3に進んでください。

### 3. Issueを出してみる

日本語訳が存在しなかった場合、まずは日本語訳を作成しても問題ないか、Issueで聞いてみるのがいいでしょう。
どの言語でIssueを書くかは、他の方のIssueを見て合わせるのがいいですが、大抵は英語になるはずです。

自分は以下のような[Issue](https://github.com/baomidou/mybatis-plus-doc/issues/403)を出してみたところ、やってみてくれとの反応を得られたので、早速取り掛かりました。

![issue-to-mybatis-plus-document.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/6a76afe0-935e-49fb-b5f2-9909a15dcc93.jpeg)

### 4. ルールを確認

ブランチの切り方などにルールを設けているところもあるので、併せて確認しましょう。
大抵はREADME.mdに載っています。
MyBatis-Plusドキュメントには特に設けられていなかったです。

### 5. Forkしてローカルに持ってくる

Forkとは、他人のリモートリポジトリを自分のリモートリポジトリとしてコピーすることを指します。
このコピーしてきたリポジトリの中身に変更を加えて、最終的にプルリクエストとして提出する、というイメージになります。

リポジトリページの右上、Starの左にあるForkボタンを押下し、後は画面の表示に従いましょう。

![where-is-fork-button.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/2fa7f1a6-72d0-4d73-be70-2d38c2f20ffb.jpeg)

### 6. 翻訳作業開始

ここからが本番です！

今回、僕は日ごろお世話になってるCursorを翻訳ツールとして使うことにしました。
理由としては、markdownなどの形式もそのままにして、差分を分かりやすく表示した上で翻訳してくれるからです。
ChatGPTやDeepLにコピペして翻訳し、それをまたエディタにコピペするより、効率よく作業を進めることができます。

これにより、自分で一から訳文を考える必要がなくなり、「この日本語訳は元の外国語と照らして適切か」のみ判断すれば良くなります。
この差は非常に大きく、文章を考えるのが苦手であっても、この方法なら、単純に間違い探しをするような感覚で翻訳作業を進められます。

具体的にはまず、元のドキュメントファイルを、翻訳後にドキュメントが配置されるディレクトリ配下にコピペして持ってきます。
今回、[MyBatis-Plus](https://github.com/baomidou/mybatis-plus)の[ドキュメント](https://www.baomidou.com/)は、[Astro Starlight](https://starlight.astro.build/)という静的サイトジェネレーターを用いて構成されており、翻訳に際してmdファイルを配置する場所も決まっていたので、それに合わせてコピペしました。

次に、チャットに「{ファイルパス}は中国語のドキュメントです。日本語に翻訳してください」のように入力・送信します。

上手く行くと、以下のように翻訳が完了します（日本語版は翻訳完了しているので、今回は中国語→英語への翻訳を例に挙げています）。

![translation-by-cursor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/7aa4ff44-0926-4236-982b-ea78be503804.png)

差分が表示されるので、おかしな翻訳になっている部分は修正した上でAcceptします。

#### 翻訳時注意すること

以下、翻訳に際しての注意点を挙げます。

##### 注意点1：翻訳は1ファイルごとに行う

一度に全部を翻訳させようとすると、訳文が上手くファイルに適用されないことがあります。
そのため、欲張って全てのドキュメントを一気に翻訳しようとするのではなく、1ファイルずつ翻訳していくのが良いでしょう。

##### 注意点2：高性能モデルを使う

当然ではありますが、性能が高いとされるモデルを使用した方が、精度の高い翻訳結果になります。
試した中だと、claude-3.7-sonnetやgemini-2.5-pro-expの質はかなり高いと思いました。
Cursorで使用できるモデルは[こちら](https://docs.cursor.com/settings/models)に記載されているので、適宜性能が高そうなものを選択してください。

##### 注意点3：長い文章を訳す時、後半に要注意

プロンプト次第で改善する可能性もありますが、自分の環境では、1000行近くあるような長い文章を翻訳する際、後半になるにつれて露骨におかしな翻訳が増えてきました。
1つの文章を丸々飛ばしたり、日本語だと不自然な怪しい単語を使い始めたりします。
そのため、特に後半は注意しながら修正を進めましょう。

##### 注意点4：統一した方が良さそうな個所は手動で修正、またはProject Rulesを使う

例えば、今回のドキュメントだと、「代码生成器」という単語が頻出します。

「代码」はコード、「生成器」はジェネレーターという意味なのですが、AIは「コードジェネレータ」「コードジェネレーター」「コード生成器」など、複数パターンの翻訳を生成してきます。
翻訳を完了した後、そのような同じ用語を使っている個所については、置き換えるなどして修正しましょう。

もし事前に統一した方が良さそうな個所が分かっているのなら、CursorのProject Rulesにその旨を記載した方が、より精度の高い翻訳を生成できるはずです。

### 7. こまめにコミット＆プッシュ

コミットやプッシュの単位については諸説ありますが、自分はとにかくこまめにやってしまうのが一番だと考えています。
手順8でも紹介するように、後からコミットはまとめることができるのと、万一のためのバックアップになるからです。

### 8. コミットをまとめる

他人のソースコードにコミットする以上、コミット履歴はキレイにしておいた方が良いでしょう。

方法は色々ありますが、自分はVSCode拡張のGitLensを使いました。
具体的には、[こちらの記事](https://zenn.dev/nkshn/articles/74e726511fe0c2)を参考にしました。

### 9. プルリクエストを作成する

Forkした自アカウントのリポジトリページを開くと、プルリクエストを提出するかという文言が表示されているので、そのまま指示に従ってプルリクエストを作成します。
今回自分は[こちらのプルリクエスト](https://github.com/baomidou/mybatis-plus-doc/pull/406)を提出しました。

### 10. マージされるのを待つ

後は待ちましょう。
場合によっては、相手やAIから修正の依頼が来ることもあります。

![pr-point-out.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/fffe74df-e3c2-4657-ace6-2eef81c46240.jpeg)

その際は、相手の言っていることを良く理解して、修正するようにしましょう。

### 11. マージされる

おめでとうございます。OSSに貢献できました！

![pr-merged.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/39fabdeb-a7e7-4427-ab98-cff0c46970a8.jpeg)

## まとめ

どうでしょう。これなら自分もできそう！と感じたのではないでしょうか？
自分はCursorに課金していますが、無料枠だけでも結構使えますし、やや面倒にはなりますがDeepLやChatGPTを使っても同じようなことができます。

OSS活動というのは、コードだけではなく、色々な方面で貢献できるのです。
ドキュメントの翻訳も立派なOSS活動の1つです。
あなたも是非、自分にできることから始めてみてはいかがでしょうか？