翻訳から始めるオープンソースコントリビューション

初めてGitHubのリポジトリに翻訳でコントリビュートした話と、
翻訳からでも日本のコミュニティを盛り上げましょうという話。
（簡単なGitHubの使い方付き）

##はじまり

プログラミングを始めた頃から私はオープンソースにコントリビュートすることに憧れを持っていたのだが、GitHubの慣例も良くわからないし、そもそもソースコードを見ても何をやってるかすらわからないものばかりで手を出せずにいた。

しかしエンジニアとしてお仕事をしていくうちに読めるコードも増えて、近頃はGitHubのトレンドをチェックすることが楽しくなってきていた。そうしているうちにGitHubには翻訳が歓迎されているリポジトリがたくさんあり、超人気のリポジトリであっても「案外簡単にコントリビュートできそうやん！」ということに気づいた。そこで翻訳からオープンソースコントリビューションをはじめてみることにした。

せっかくなので内容としても自分の知識として身に付けたいもので、かつスタンダードなGitHubの慣例も学べたらいいと思い、多くの注目があって現在も活発なものを探した。そこで選んだのがyangshunという人が作っていた「[front-end-interview-handbook](https://github.com/yangshun/front-end-interview-handbook)」というリポジトリだった。

このリポジトリはソフトウェアではなくドキュメントで、既にあった「[Front-end-Developer-Interview-Questions](https://github.com/h5bp/Front-end-Developer-Interview-Questions)」というフロントエンドエンジニアの採用面接で良く聞かれる質問集、に対して回答を与えたものだが、私が今年の1月あたりに見つけた時にはずっとトレンド上位にあった。


##いきなりプッシュ権限を与えられた

そのリポジトリでまず「[Korean Translation](https://github.com/yangshun/front-end-interview-handbook/issues/12)」というIssueを見つけた。内容は、以下ような感じ。
> 韓国語の人「韓国語に翻訳したいんだけど、いい？」
> yangshun「いいよ、このリポジトリそのまま使うのが楽だと思うから権限あげる。」


これを見て「めっちゃ簡単に権限もらえるやん！」と思い[日本語翻訳する旨のIssue](https://github.com/yangshun/front-end-interview-handbook/issues/28)を立てたところ、こちらもすぐ受け入れてもらった。私のGitHubのプロフィールは全く空であったにも関わらずだ。
いきなりスター1万超のリポジトリにプッシュできるようになった。

##最初に経験したやり方

このリポジトリにそのままプッシュする方式は簡単だった。
/Translationと言うディレクトリにそれぞれの言語のディレクトリがあり、その/Translation/Japaneseディレクトリ内に英語ファイルの構成をそのまま作る形だったので、他の言語の翻訳者などとコンフリクトする心配もなかった。

手順は以下。
> まずリポジトリを手元のパソコンにクローン。
> そして、編集・コミットを繰り返し、ある程度まで来ると、プッシュ。
>
>> この時、作業途中で既に誰かがプッシュ等して状態が進んでいた場合プッシュは失敗する。
>> そういった場合にはプルを行うことで手元の状態をyangshunのリポジトリと合わせることでプッシュできるようにする。

この方法は手順が少なく、一人で開発する場合とほとんど同じだった。
しかし、「俺みたいなよくわからんもんに権限持たせてええん？」と思ったとおり、翻訳希望者に破壊的な変更を許可するものであり、たくさんのコントリビュートを受ける際には不安があるものでもある。

yangshunは2月中旬にGitHubでより一般的に行われている方法に切り替えることにした。

##次に経験したやり方（より一般的なGitHub流の方法）

方法の切り替えが発表され、私もmasterには直接プッシュできなくなった。
yangshunは私に新たにふたつのやり方を提案した。

1. 私にはyangshunのリポジトリの別のブランチを変更できる権限はあったので、その権限を使ってフォークせずにyangshunのリポジトリに別ブランチを作って作業を進める方法だ。実際にタガログ語に翻訳している人はそのようにしていた。
2. ふたつ目が何の権限もなくてもできる方式で、下記に詳細を記した。こちらの方が汎用性が高くこちらができれば１はできそうだったのでこちらで行うことにした。

これが一般的なGitHubにおけるオープンソース開発手順であり、そのやり方とは以下の様なものだ。


> まずyangshunのリポジトリをフォークし私のリポジトリをGitHub上に作る。
> 私のリポジトリを手元にクローンする。
> 手元で別名のブランチ例えば、(`jp-patch`)を作りそこで作業・コミットする。
> 私のGitHubリポジトリにも`jp-patch`というブランチを作ってプッシュ。
> そのGitHubの`jp-patch`からそのままプルリクエストを送る。
> yangshunにマージしてもらう。
> 
>> この方法では、作業途中にリポジトリが進んでいても問題なくプルリクエストを送ることがでる。yangshunがマージするわけだ。
>>
>> しかし、私側で最新に合わせてあげてから、プルリクすることもできる。
>> `jp-patch`の変更をコミットしたあと、`master`ブランチに切り替える。
>> ここは、みんなが共有しているyangshunのリポジトリの以前の状態と同じなわけだが、yangshunのリポジトリは既に少し進んでいるので、yangshunのリポジトリをリモートリポジトリ（慣例的に`upstream`という名前）として追加して、そこからプルする。
>> すると手元の`master`ブランチは最新になる。この`master`は`upstream`からプルするだけのために置いておくのだ。
>> そして、`jp-patch`に切り替えて、そこから`master`の状態を取り込んでからプッシュし、プルリクする。
>
> また、プルリクに対して、そのままでは受け付けられないので変更してほしいと言われることがあるが、その場合、そのプルリクしたブランチが`jp-patch`だとすると、手元の`jp-patch`で編集コミットプッシュするだけで、プルリクが変更される。
> つまり、プルリク後も下手にそのブランチで変更を行うと、プルリク自体が変わってしまうので、そのブランチはそのプルリク専用だと思って利用し、次の変更の際はまた別にブランチを作るのが良い。

これをやってみるとついに「俺めっちゃGitHub使ってる、、」という感じがしてきて楽しくなってきた。この手順はなんとなく見聞きしてはいたが、実際に手を動かしてみていろんな時の状態をみることでgitの使い方のアイデアなど含め多くのものを得られたと思う。


##日本語訳済のリポジトリは他の言語に比べても少ない

楽しくなってきたのでもっと翻訳でコントリビュートできるリポジトリはないかと探してみると、たくさん見つけることができた。
調べ方は主にGitHubのリポジトリを[スター数順](https://github.com/search?utf8=%E2%9C%93&q=stars%3A%3E10000&type=Repositories)で見ていって、そのリポジトリ内のIssueでTranslationという単語で検索する。すると大抵の場合誰かが翻訳しようかという提案をしていて、それに対して所有者がどういう方法で貢献してほしいかを応えている。例えば、yangshunの様に翻訳フォルダを作りその中に翻訳を作っていってプルリクを送るパターンや、Web上の好きなところに翻訳ドキュメントを公開するとリンクを貼ってもらえるもの、Crowdwinという外部の翻訳作業を効率化するツールを利用するものなどがあった。

GitHubのリポジトリを[スター数順](https://github.com/search?utf8=%E2%9C%93&q=stars%3A%3E10000&type=Repositories)で見てみると、例えば1７位が[linux](https://github.com/torvalds/linux)だがこのスター数が5.6万、100位がプログラミング言語の[Rust](https://github.com/rust-lang/rust)で2.7万とかそのくらいのスケール感なわけだが、この100位以内に入る様なリポジトリであっても日本語翻訳で個人レベルで貢献できるリポジトリはたくさんあるのだ。

というか、日本語翻訳は本当になされていないことが多い印象を受けた。
GitHubを見ていると中国語オンリーのリポジトリがそこそこ目に入るのでGitHubを見るだけで中国の存在感を強く感じる。翻訳に関しても中国語のものはされていることが多いし、他にも、スペイン、イタリア、韓国、ブラジル、フィリピン、インドネシア、なんかの翻訳がよくなされているという印象を受けた。しかし、たとえ10ヶ国語に翻訳されていたとしても、日本語に翻訳されていないようなことがあった。
貢献できる余地が残っていることで私は良かったのだが、一方で「日本のエンジニアコミュニティってあんまりなん？」と少し心配になった。

そこで日本語翻訳で貢献できそうなリポジトリのリストを作ることにした。


##日本語翻訳で貢献できるリポジトリリストを作った

ということで作ったものが[こちら](https://github.com/yhay81/ja-translation-todo)。
私が次にコントリビュートするリポジトリを決めるためのメモにするという目的も半分で作ったものなので今の所WebとPythonが多いかもしれない。
スター数の多いものだけでなく「これ日本語にしてほしい」と誰かが思っているものもそれこそオープンコミュニティの力で自由に受け付けるようにし、このリスト自体がプルリクで育つようになっていくといいなと思う。

個人的におすすめなのはJavaScriptのスタイルガイドである「[standard](https://github.com/standard/standard)（スター1.7万）」など。これはそこまで分量が多くなく、多言語で翻訳されているのに、日本語がない。
また、「[front-end-interview-handbook](https://github.com/yangshun/front-end-interview-handbook)」を修正するプルリクをしてくれるのも私は嬉しい。

「英語読めないよー」という人はGoogle翻訳にかけて、それを自然な日本語にしていく方法でも良い貢献になると思う*（（追記）ライセンス問題が絡む可能性があるので、Google翻訳利用時にはコミュニティに相談すべき）*。多少なりとも進んでいると、直しやその次を誰かが担いやすくなるし、更新が行われているということだけでコミュニティは活性化されると思う。



またGitやGitHubの使い方に不安があるという人は、先の[翻訳できるリポジトリリスト](https://github.com/yhay81/ja-translation-todo)でコントリビュートの練習してもらったり（サンドバッグ扱い歓迎です）、Issueやこの記事のコメントで質問してくれるのもいいと思う。
とりあえずフォークして、クローンしてブランチ切って、編集して、アド、コミットしてプッシュしてプルリクだ。（はじめてだとややこしいが、やってみることで簡単だと感じられるようになると思う）

##まとめ

とりあえず声をあげたら、強そうなエンジニアとコミュニケーション取れて楽しかった。
自分の関心のある技術のドキュメントを翻訳すれば勉強にもなるし、より愛着も湧くし、作者とコミュニケーションもとれるし、GitHubのプロフィールも充実するし、日本人で勉強しようとしている人たちを応援することもできるし、GitHubに慣れてない人は練習にもなるし、いいことたくさんある。
みんなもやろう。