【iOS】都道府県のテキストリソースを楽に作った

都道府県のテキストリソースを作るのがめんどくさかったので、

1. R.Swiftなどを使わず、enumを使ってテキスト取得
2. [VSCodeのプラグイン](https://github.com/wmaurer/vscode-change-case)を使って、文字置換
3. linuxの`paste`コマンドを使って水平結合

で、楽々対応しました。
(なお調査対応2時間、記事1時間

# ソースコード

```swift:Prefecture.swift
enum Prefecture: Int {
    case hokkaido
    case aomori
    case iwate
    case miyagi
    case akita
    case yamagata
    case fukushima
    case ibaraki
    case tochigi
    case gunma
    case saitama
    case chiba
    case tokyo
    case kanagawa
    case niigata
    case toyama
    case ishikawa
    case fukui
    case yamanashi
    case nagano
    case gifu
    case shizuoka
    case aichi
    case mie
    case shiga
    case kyoto
    case osaka
    case hyogo
    case nara
    case wakayama
    case tottori
    case shimane
    case okayama
    case hiroshima
    case yamaguchi
    case tokushima
    case kagawa
    case ehime
    case kochi
    case fukuoka
    case saga
    case nagasaki
    case kumamoto
    case oita
    case miyazaki
    case kagoshima
    case okinawa
    
    var localizedString: String {
        let string = String(describing: self)
        let upperFirstLetterString = string.prefix(1).uppercased() + string.dropFirst()
        
        return NSLocalizedString(upperFirstLetterString,
                                 tableName: "Prefecture",
                                 bundle: Bundle.main,
                                 value: "",
                                 comment: "")
    }
}

```

# 1.とりあえずリソースファイル作成
ソースコードのtableNameと一致する `Prefecture.strings` というファイルをつくりました。

# 2. enumのケース一覧をコピペ
こんな感じ

```text:prefecture-en.txt
case hokkaido
case aomori
case iwate
case miyagi
case akita
...
```

結果を適当な名前のテキストファイルで保存してください。
ex) prefecture-en.txt

#3. caseを取り除く
```
find: "case "
replace: ""
```
で全置換

```text:prefecture-en.txt
hokkaido
aomori
iwate
miyagi
akita
yamagata
...
```

#4. 先頭文字置換
[change-case](https://github.com/wmaurer/vscode-change-case)というVSCodeのプラグインを利用しました。

変換したい文字列を全部選択して、`cmd` + `shift` + `p` から `Change Case UpperFirst` を選択

```text:prefecture-en.txt
Hokkaido
Aomori
Iwate
Miyagi
Akita
...
```

#5. 翻訳
一覧のまま、Google翻訳にかけます。

```text:prefecture-ja.txt
北海道
青森
岩手県
宮城県
秋田
...
```

翻訳結果を適当な名前のテキストファイルで保存します
ex) prefecture-ja.txt

#6. linuxコマンドで水平結合
[参考はこちら](https://tech.nikkeibp.co.jp/it/article/COLUMN/20131209/523511/)

```bash:paste
 paste -d "=" prefecture-en.txt prefecture-ja.txt
```

```text:out
Hokkaido=北海道
Aomori=青森
Iwate=岩手県
...
```

#7. 置換
一個前の出力を `Prefecture.strings` にコピペして、正規表現をかけます。

```
find: (.*)=(.*)
replace: "$1" = "$2";
```

で全置換。

```text:Prefecture.strings
"Hokkaido" = "北海道";
"Aomori" = "青森";
"Iwate" = "岩手";
"Miyagi" = "宮城県";
"Akita" = "秋田";
...
```

# テスト
GREEEEEEN!

![スクリーンショット 2018-09-21 3.36.59.png](https://qiita-image-store.s3.amazonaws.com/0/114709/5674b0c2-553e-11e8-3c14-705a56d3567c.png)

# 完成！
翻訳精度的にやや手直しが必要な部分があるので、それは手直しするしかないです。
swift4.2では `CaseIterable ` が使えるようになるので、さらにいい感じかも。

shellとか正規表現とかテキストエディタの機能をドップリ使ってiOS開発楽にしたい()

# 完成物

```text:Prefecture.strings
"Hokkaido" = "北海道";
"Aomori" = "青森";
"Iwate" = "岩手";
"Miyagi" = "宮城";
"Akita" = "秋田";
"Yamagata" = "山形";
"Fukushima" = "福島";
"Ibaraki" = "茨城県";
"Tochigi" = "栃木";
"Gunma" = "群馬";
"Saitama" = "埼玉";
"Chiba" = "千葉";
"Tokyo" = "東京";
"Kanagawa" = "神奈川";
"Niigata" = "新潟";
"Toyama" = "富山";
"Ishikawa" = "石川";
"Fukui" = "福井市";
"Yamanashi" = "山梨";
"Nagano" = "長野";
"Gifu" = "岐阜";
"Shizuoka" = "静岡";
"Aichi" = "愛知県";
"Mie" = "三重";
"Shiga" = "滋賀";
"Kyoto" = "京都";
"Osaka" = "大阪";
"Hyogo" = "兵庫";
"Nara" = "奈良";
"Wakayama" = "和歌山";
"Tottori" = "鳥取";
"Shimane" = "島根";
"Okayama" = "岡山";
"Hiroshima" = "広島";
"Yamaguchi" = "山口";
"Tokushima" = "徳島";
"Kagawa" = "香川";
"Ehime" = "愛媛";
"Kochi" = "高知";
"Fukuoka" = "福岡";
"Saga" = "佐賀";
"Nagasaki" = "長崎";
"Kumamoto" = "熊本市";
"Oita" = "大分";
"Miyazaki" = "宮崎";
"Kagoshima" = "鹿児島";
"Okinawa" = "沖縄";
```