Vuetifyの開発に貢献する（ドキュメント翻訳とOSSコミット）

[^1]: [Translation Memory](https://support.crowdin.com/translation-memory/)という機能によって、行われています。
[^2]: https://github.com/vuetifyjs/vuetify/pull/6373

## はじめに
[Vuetify](https://vuetifyjs.com/en/)はVue.jsのUIフレームワークで、OSSで開発されています。もしVuetifyの開発に貢献していきたい場合、大きく分けて次の2つの方法があります。

- ドキュメントを翻訳する
- バグ修正をしてPRを投げる

これらについて自分自身の経験を元に、具体的な方法を解説していきます。

## ドキュメントを翻訳する
Vuetifyのドキュメントには、[日本語版](https://vuetifyjs.com/ja/)のページがあります。ただページを見てもらうと分かる通り、日本語訳がまだまだ不十分です。
バージョン1系のころまでは翻訳もGitHubでのPRベースでも受付けていたようですが、現行のバージョン2系では[Crowdin](https://crowdin.com/)という、翻訳支援のサービス上で翻訳するようになっています。

### Crowdinでの翻訳作業について
CrowdinはGitHubのアカウントで登録することができます。登録後に[Vuetifyのプロジェクトページ](https://crowdin.com/project/vuetify)から、翻訳を開始することができます。プロジェクトページには各言語の翻訳の進捗状況が載っているのですが、日本語は現状「**8%**」とかなり低いです😢

<img width="779" alt="スクリーンショット 2019-12-17 16.08.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232357/8a689733-5c37-72b4-3a01-06649b764c4e.png">

Crowdinは翻訳支援のサービスということもあり、翻訳に関する機能が充実しています。以下は実際のCrowdin上の編集画面です。左から翻訳したいワード選び入力欄に翻訳を入力して、「SAVE」ボタンで保存します。
ワードによっては入力欄に翻訳提案を出してくれることがあります。今回の場合は他の箇所で「Hide controls」が「コントロールを隠す」とすでに翻訳されていたため、「Hide on scroll」が類似ワードとして判定されました[^1]。これを「コントロールを隠す」から「スクロールを隠す」に変更するだけで翻訳が済むので、作業のスピードアップや表現の統一に繋げることができます。

<img width="846" alt="スクリーンショット 2019-12-17 16.26.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232357/2b263f37-0cda-795b-8836-b61786011f9a.png">

### 日本語版のページに反映されるまでの流れ

実際の流れは不明ですが、観察する限りでは次のような流れで反映しているようです。私たちが行うのは1〜3までの部分で、これを繰り返していきます。

1. [Vuetifyのプロジェクトページ](https://crowdin.com/project/vuetify)から、「japanese」を選択
2. 翻訳したいファイルを選択
3. 編集画面から翻訳して保存
4. 翻訳したファイルがコアメンバーによって、GitHubにマージされる（例：https://github.com/vuetifyjs/vuetify/pull/8632）
5. リリース

## バグ修正をしてPRを投げる
Vuetifyのソースコードは[vuetifyjs/vuetify](https://github.com/vuetifyjs/vuetify)のリポジトリで管理されています。バグ修正は翻訳に比べると難易度が高く技術的なハードルも上がります。ただスター数が20000以上という大規模リポジトリで、[README.md](https://github.com/vuetifyjs/vuetify/blob/master/README.md)にも自分のGitHubアイコンが表示されるようになるので、結構嬉しいです！
ちなみに私自身が初めてOSSにPRを出してマージされたのも実はVuetifyでした[^2]。ルールに沿って意図した修正ならそこまで厳しい指摘は飛ばずにマージされる印象なので、大規模リポジトリと恐れずに初めての方でもおすすめです。

### バグ探し
自分でバグを見つけてPRを出すことももちろんできますが、そう簡単に発見できるものでもないので[Issue](https://github.com/vuetifyjs/vuetify/issues )から探してみるのがおすすめです。いっぱいあるのでどれに取り組むのか悩ましいですが、自分の場合は次のような基準で探しています。

- `[Bug Report]` というタイトルが付いていること
  - [T: bug](https://github.com/vuetifyjs/vuetify/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+bug%22)というラベルが付いているとなお良い（コアメンバーが少なくとも一度は確認して付けたラベルのため、バグである信ぴょう性が高そう）
- 誰もアサインされていないこと
- codepenなどへのリンクがあり、そのページでバグが再現できること

また初めての方は、[good first issue](https://github.com/vuetifyjs/vuetify/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)のラベルがついたIssueもあるので、これを手がかりにするのも一つの手です。

### 環境構築
取り組むIssueを決めたら、環境構築を行っていきます。ここの内容についてはドキュメントの[Contributing](https://vuetifyjs.com/ja/getting-started/contributing)にも書かれているので合わせてご参照ください。

#### commitizenのインストール
Vuetifyのリポジトリのコミットは[commitizen](https://github.com/commitizen/cz-cli)というツールで、対話的に生成されたコミットになっています（たまに普通のコミットもあったりしますが・・・）。そのためcommitizenをインストールしておいて、PRを出すときのコミットもcommitizenを使って行うようにします。

```bash 
$ npm install -g commitizen
```

#### 開発環境のセットアップ
次に[vuetifyjs/vuetify](https://github.com/vuetifyjs/vuetify)リポジトリをforkしてcloneをします。その後、Vuetifyのソースコードのフォルダに移動して、パッケージのインストールとビルドを実行します。

```bash 
$ git clone git@github.com:<github name>/vuetify.git
$ cd vuetify/packages/vuetify/
$ yarn
$ yarn build
```

#### プレイグラウンドファイルのコピー
リポジトリの「[packages/vuetify/dev](https://github.com/vuetifyjs/vuetify/tree/master/packages/vuetify/dev)」フォルダに、`Playground.template.vue`というファイルがあります。
開発環境はこのフォルダ内の`Playground.vue`のvueファイルの内容で起動するようになっているため、そのためのサンプルファイルです。デフォルトだと`Playground.vue`はバージョン管理に入っていないために存在しないため、いったん同じ内容でコピーをしておきます。

```bash　
$ pwd
<project root>/vuetify/packages/vuetify
$ cp dev/Playground.template.vue dev/Playground.vue
```

開発環境で修正したコンポーネントなどの動作を確認したいときは、この`Playground.vue`ファイルを修正して確認していく流れになります。後にまた書きますが、PRを出すときもこの`Playground.vue`ファイルの内容をペーストする必要があります。

#### 開発環境の起動

開発環境を起動するには次のコマンドを実行します。特に設定を変えてなければコンパイル後にhttp://localhost:8080 で、「Welcome to Vuetify」というタイトルのページが開くはずです。

```bash　
$ yarn dev
```

### 開発の流れ
開発環境が構築できたら、実際の修正に移っていきます。といっても例がないと説明がしずらいので今回は、[[Bug Report] v-btn: Loading indicator too large on small buttons](https://github.com/vuetifyjs/vuetify/issues/9870 )というIssueに、仮に私自身が取り組む場合の流れを紹介していきます。

#### 修正するコードに当てをつける
Issueタイトルと付いているラベルから、[Buttons](https://vuetifyjs.com/ja/components/buttons)に関するバグのようです。Vuetifyのコンポーネントのソースコードは「[packages/vuetify/src/components](https://github.com/vuetifyjs/vuetify/tree/master/packages/vuetify/src/components)」フォルダ配下に、コンポーネントごとにフォルダが切られています。Buttonsの場合は「[packages/vuetify/src/components/VBtn](https://github.com/vuetifyjs/vuetify/tree/master/packages/vuetify/src/components/VBtn)」のような具合です。
コンポーネントのフォルダの中身は、コンポート定義・ユニットテスト・sassのスタイルなどが入っていて、他のコンポーネントもだいだいはこの構成になっています。このフォルダの中身を直せばバグも直るだろうという当てを付けます。
![スクリーンショット 2019-12-18 1.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232357/e1a8266b-1de8-0246-b793-feea60417400.png)

#### プレイグラウンドファイルを修正
コードを直したあと、先ほど作成した`Playground.vue`にButtonsのコンポーネントを置いてみて、開発環境で確認します。codepenがあるIssueならそれをコピペして、貼り付けるのが楽です。

```vue 
<template>
  <v-container>
    <!--  -->
    <div class="text-center">
      <v-btn outlined x-small loading>btn</v-btn>
    </div>
  </v-container>
</template>

<script>
export default {
  data: () => ({
    //
  })
}
</script>
```

#### commitizenでコミットをする
開発環境でうまく動作しそうだったら、コミットします。前述した通り、commitizenでコミットを行います。`git cz`というコマンドを打つと次のような対話式のターミナルが開き、これに順番に答えていきます。詳しい説明は[コミットのガイドライン](https://vuetifyjs.com/ja/getting-started/contributing#commit-guidelines-w-commitizen)がドキュメントにあるので、こちらをご確認ください。

```bash 
$ git cz
cz-cli@4.0.3, cz-conventional-changelog@3.0.1

? Select the type of change that you're committing: (Use arrow keys)
❯ feat:     A new feature 
  fix:      A bug fix 
  docs:     Documentation only changes 
  style:    Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) 
  refactor: A code change that neither fixes a bug nor adds a feature 
  perf:     A code change that improves performance 
  test:     Adding missing tests or correcting existing tests 
```

### PRを出す
修正をして大丈夫そうだったらPRを出してみましょう！まず修正内容によってPRを出すブランチが決まっているので、ドキュメントの[プルリクエスト](https://vuetifyjs.com/ja/getting-started/contributing#submitting-changes-pull-requests)の部分の説明をよく読んでおきます。バグ修正の場合は`master`ブランチへのPRになります。
またPRは[テンプレート](https://github.com/vuetifyjs/vuetify/blob/master/.github/PULL_REQUEST_TEMPLATE.md)があるので、これに沿った形でPRの説明を埋めていきます。説明通りに内容を埋めたりチェックを付けていけばそこまで難しくないですが、気をつけるべきところは次の点です。

- Motivation and Context  
Issueに対しての修正の場合は、`#9870` のようにIssue番号を書く
- Markup  
`// Paste your FULL Playground.vue here` となっている箇所に、自分の開発環境で動かしていた修正内容が確認できるような、`Playground.vue`の中身をペーストします。

PRをサブミットするとCIが動作します。もしバツマークが付いた場合はコードカバレッジのチェックに引っ掛かってしまっている場合が多いです。その場合はテストコードを追加する必要があります。
テストコードについても説明すると長くなってしまう（自分自身の理解が足りないのもある）ので、コンポーネントのフォルダの`__tests__` 配下の既存テストを参考にして、追加するのが一番良いと思います。[Unit testing](https://vuetifyjs.com/ja/getting-started/unit-testing)のページも合わせてご参照ください。

無事にCIが通ったら、あとはマージされることを祈りましょう！

## まとめ
少し長くなってしまいましたが、改めて今回はVuetifyの開発に貢献する方法として、次の2点を解説しました。

- ドキュメントを翻訳する
- バグ修正をしてPRを投げる

今後もVuetifyが開発され続けていくためにも引き続き貢献は続けていきたいと思っています。今回の記事で少しでもみなさんがVuetifyに貢献するきっかけになれば嬉しく思っています！