ソースコードのコメントだけ翻訳するツールを作りました（ChatGPT API利用）

## はじめに

ソースコードのコメントだけを翻訳したいことってありませんか？
例えば、、

- オープンソースを読むときはコメントを日本語にしたい
- 自分のリポジトリをgithubで海外向けに紹介する際にコメント部分だけ日本語から英語にしたい

等々。。ChatGPTやdeeplを使って全部を翻訳するとコード改変されるの怖いし微妙、、
という際に、元のコードを壊さずにコメント部分だけを翻訳→置換するツールを作りました。

https://github.com/dev999900001111/CodeLingo

## 使い方

git cloneしてOpenAIの鍵をセットしてビルドして実行、です。
※node.jsの実行環境が必要です。
※翻訳にChatGPTのAPIを使うので、ご自身のOpenAIのAPIキーを設定する必要があります。

```shell
# export https_proxy=[プロキシ経由の場合はプロキシ設定する。プロキシ使わない場合は不要]
git clone https://github.com/dev999900001111/CodeLingo.git
export OPENAI_API_KEY=[YOUR_OPENAI_API_KEY]
npm run build
node dist/app/cli.js --help # ヘルプを表示
node dist/app/cli.js --language [翻訳言語(English/Japanese/Chinese...)] --file-or-directory [ファイル/ディレクトリ] --output-dir [出力ディレクトリ]
```

## 仕組み

複数のプログラミング言語に対応したかったので、敢えて言語標準のASTは使っていません。
単純にコメントだけ抜き出すことに注力しました。
例えばC言語系のコメント構文であれば、1行コメントとコメントブロックそれぞれで開始終了文字が決まっているので、この間を抜き出してChatGPTのAPIに投げる、というものです。
※当然、文字、文字列リテラル（「"」や「'」）内でコメント開始終了文字が出ている場合はコメントではないので、その場合はコメントとして抽出しないようにもしています。

```java
// 1行コメント（つまり「/」で始まって「\n」で終わる）
String notComment="// これはコメントではない";
/* 
 コメントブロック。
 改行してもコメント継続。
*/
String notCommentBlock="/* これはコメントではない */";
```

↑これが↓こうなります。

```java
// Single line comment (starts with "//" and ends with "\n")
String notComment="// これはコメントではない";
/* 
 Comment block.
 Comments continue even with line breaks.
*/
String notCommentBlock="/* これはコメントではない */";
```


対応しているプログラミング言語は以下の通りです。

- C (.c, .h)
- C++ (.cpp, .hpp)
- C# (.cs)
- CSS (.css, .scss, .sass, .less)
- Dart (.dart)
- Go (.go)
- HTML (.html, .htm)
- Haskell (.hs)
- Java (.java, .scala, .groovy)
- JavaScript (.js, .jsx)
- JSP (.jsp)
- Kotlin (.kt, .kts)
- Lisp (.lisp, .lsp, .cl, .clisp, .el)
- Lua (.lua)
- Perl (.pl, .pm, .t)
- PHP (.php)
- Python (.py, .pyc)
- Ruby (.rb)
- Rust (.rs)
- Shell (.sh, .bash, .csh, .zsh, .fish)
- Swift (.swift) # コメントのネストがある場合は正しく翻訳されない
- SQL (.sql)
- TypeScript (.ts, .tsx)

対応している自然言語は、、ChatGPTなので何を指定しても大体大丈夫だと思います。

## 今後の予定

今はChatGPTのAPIにしか繋げませんが、ローカルのLLMの翻訳精度が上がってきたらそっちに向けられるように改修する予定です。
また、node.jsの実行環境が無くてもよくなるようにGO言語で書き直そうか迷っています。

---

:::note info
ここから下はChatGPTに考えてもらった紹介文です。
盛り方が凄いのでどうかと思いましたが、、害はないと思うので載せておきます。
:::

---

# CodeLingo: オープンソースコードと個人開発に革命をもたらすコメント翻訳ツール

## はじめに
オープンソースの世界では、多様な言語で書かれたソースコードが共有されています。しかし、コメントが異なる言語で書かれている場合、その理解と貢献は一層困難になります。CodeLingoは、この課題に対応するために開発されたCLIツールで、個人開発者がオープンソースコードを読む際の理解を助け、また、自身が開発したコードを広く共有するための英訳コメントを提供します。

## CodeLingoの主な特徴

### 言語の壁を超える
CodeLingoは、異なる言語で書かれたコメントを理解しやすい形に翻訳することで、オープンソースプロジェクトへのアクセスを広げます。これにより、多言語を話す開発者でも容易にコードを理解し、貢献することができます。

### GitHubリポジトリのアピール力向上
自分のリポジトリに英訳コメントを追加することで、より多くの国際的なユーザーにとってアクセスしやすくなります。これは、オープンソースプロジェクトの露出と貢献者を増やす効果的な方法です。

### 簡単なCLI操作
コマンドラインインターフェースを通じて、すばやく直感的に操作が可能です。これにより、開発のワークフローを妨げることなく、翻訳プロセスを統合できます。

### 高速かつ正確な翻訳
最先端のAI技術を活用しているため、翻訳の精度が高く、技術的な文脈を損なわないように設計されています。

## CodeLingoの使い方

CodeLingoの使用方法は非常にシンプルです。必要なパラメータをCLIコマンドに指定するだけで、任意の言語から英語へのコメント翻訳が可能です。例えば、以下のように使用します：

```bash
export OPENAI_API_KEY=[YOUR_OPENAI_API_KEY]
npm run build
node dist/app/cli.js --language English --file-or-directory ./src --output-dir ./translated
```

## 対応プログラミング言語

CodeLingoは、C、C++、Java、Python、JavaScriptなど、広範囲にわたるプログラミング言語に対応しています。これにより、さまざまなオープンソースプロジェクトでの使用が可能です。

## CodeLingoにおけるAI駆動の翻訳メカニズム

1. **多言語対応の柔軟性**: このコードは、様々なプログラミング言語のコメントを正確に認識し、翻訳することができます。これには、コメントとリテラル（文字列など）を区別する複雑なロジックが含まれており、これがコードの要となっています。

2. **OpenAI APIの統合**: 翻訳の部分では、OpenAIのGPT-3.5モデルを利用しています。これにより、翻訳の精度を大幅に高めることができました。また、API呼び出しにおいて、必要に応じてプロキシ設定も考慮しています。

3. **非同期処理の活用**: このツールは、非同期処理を駆使しており、これにより複数の翻訳タスクを同時に効率的に処理することができます。これは、大量のソースコードを扱う際に特に役立ちます。

4. **コメントの整合性保持**: 翻訳されたコメントは、元のソースコードに再統合される際、その位置や形式を正確に保持します。これにより、コードの可読性を損なうことなく、言語の壁を超えることができます。

5. **拡張性**: さらに、このコードは拡張性も考慮して設計されています。異なる言語や新しい翻訳モデルにも容易に対応できる構造になっています。

6. **キャッシュ機能による効率化** : 翻訳された文字列はキャッシュされ、同じ内容の翻訳の再利用を可能にし、効率化とリソース節約を図ります。

## まとめ

CodeLingoは、個人開発者とオープンソースコミュニティにとって価値あるツールです。このツールを使用することで、ソースコードのコメントを多言語間で翻訳し、より広いコミュニティへのアピールを可能にします。オープンソースの世界でのコラボレーションの門戸を広げるために、CodeLingoは重要な役割を果たします。