pwnagotch v.1.4.3 からの日本語化

> 履歴
> 20/10/03 本線のコミットログのリンク修正
> 20/02/16 v1.4.3 日本語化を新規作成

# 最新版
もっと簡単な設定で日本語になります。

https://github.com/evilsocket/pwnagotchi/releases/tag/v1.5.3

対応方法を書きました。
https://qiita.com/k0uj1k/items/f91a3b7e3a4b9209774f

----
### v 1.4.3 の場合の日本語表示

https://github.com/evilsocket/pwnagotchi/releases/tag/v1.4.3
こちらから作成すると、英語版(lang: en)が標準になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587146/73768197-b38e-2d33-b1a0-3fc6e5ffdfba.png" width=50%>

`bt-tethering` を有効にして、`auto.update = enable' だと、自動で v 1.5.2 になります。

`/etc/pwnagotch/config.toml` ができています。`config.yml` の内容が引き継がれますが、
日本語設定のために追加が必要です。

```config.toml
[main]
lang = "jp"

[ui.font]
name = "fonts-japanese-gothic"
size_offset = 0
````

---------------
ここから <b> v 1.4.3の対応方法 </b>

pwnagotchi は "/etc/pwnagotchi/config.yml" で lang: en を lang: jp に変更すると、

```config.yml
main:
  name: 'pwnagotchi(your name)'
   # currently implemented: en (default), de, el, fr, it, mk, nl, ru, se, pt-BR, es, pt
  lang: jp
  ...
```
表示フォント"DejaVuSansMono" が日本語対応していないので、□（別名豆腐）表記になります。（日本語が出ません）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587146/c308d092-c44c-b20e-693a-6a7ce255ae61.png" width=50%>


pwnagotchi/locale/jp/LC_MESSAGES/voice.po には、日本語のセリフファイルがあるのですが、<b>とても残念だった</b>ので、探ってみました。

```
$ ssh pi@10.0.0.2

$ sudo su
# cd /usr/local/lib/python3.7/dist-packages/pwnagotchi
```

### フォント指定(うまくいかなかった)
フォントは、font.py の `PATH` で指定されています。 

```pwnagotchi/ui/font.py
from PIL import ImageFont

PATH = '/usr/share/fonts/truetype/dejavu/DejaVuSansMono'

Bold = ImageFont.truetype("%s-Bold.ttf" % PATH, 10)
BoldSmall = ImageFont.truetype("%s-Bold.ttf" % PATH, 8)
BoldBig = ImageFont.truetype("%s-Bold.ttf" % PATH, 25)
Medium = ImageFont.truetype("%s.ttf" % PATH, 10)
Small = ImageFont.truetype("%s.ttf" % PATH, 9)
Huge = ImageFont.truetype("%s-Bold.ttf" % PATH, 25)


def setup(bold, bold_small, medium, huge):
    global PATH, Bold, BoldSmall, Medium, Huge
    Bold = ImageFont.truetype("%s-Bold.ttf" % PATH, bold)
    BoldSmall = ImageFont.truetype("%s-Bold.ttf" % PATH, bold_small)
    Medium = ImageFont.truetype("%s.ttf" % PATH, medium)
    Huge = ImageFont.truetype("%s-Bold.ttf" % PATH, huge)
```

上記のように、PATHに`DejaVuSansMono`を指定しています。
これを日本語対応の別のフォントにすれば良いのではと思いました。
でも、これを変えるとせっかくの `顔` の表示が壊れてしまいます。
<b>⇒ "フォントの達人"ならば力業で何とかすると思うのですが... </b>

<b>私は別アプローチを取りました。</b>

### UIでの解決(暫定解決方法)
pwnagotchi/ui/view.py の `status` がセリフの表示です。

```pwnagotchi/ui/view.py
...
        self._state = State(state={
...
            'status': Text(value=self._voice.default(),
                           position=self._layout['status']['pos'],
                           color=BLACK,
                           font=self._layout['status']['font'],
                           wrap=True,
                           # the current maximum number of characters per line, assuming each character is 6 pixels wide
                           max_length=self._layout['status']['max']),

...
```
ここの`font`だけを、日本語フォントに指定しました。<b>(なので、暫定です。)</b>

次のように、追加しました。

```diff
# diff -u view.py.org view.py
--- view.py.org 2019-12-23 19:41:34.000000000 +0900
+++ view.py     2020-02-10 21:12:56.760000000 +0900
@@ -16,11 +16,12 @@
 from pwnagotchi.ui.components import *
 from pwnagotchi.ui.state import State

+from PIL import ImageFont
+
 WHITE = 0xff
 BLACK = 0x00
 ROOT = None

-
 class View(object):
     def __init__(self, config, impl, state=None):
         global ROOT
@@ -28,6 +29,8 @@
         # setup faces from the configuration in case the user customized them
         faces.load_from_config(config['ui']['faces'])

+        font_msg = ImageFont.truetype('/usr/share/fonts/truetype/fonts-japanese-gothic.ttf', 11)
+
         self._agent = None
         self._render_cbs = []
         self._config = config
@@ -65,7 +68,8 @@
             'status': Text(value=self._voice.default(),
                            position=self._layout['status']['pos'],
                            color=BLACK,
-                           font=self._layout['status']['font'],
+                           #font=self._layout['status']['font'],
+                           font=font_msg,
                            wrap=True,
                            # the current maximum number of characters per line, assuming each character is 6 pixels wide
                            max_length=self._layout['status']['max']),
```


たぶん、このパッチは設計思想(フレームワーク構成)とは合わないと思いますが、
ここでフォントを変更します。

`ImageFont`を設定するために、
`from PIL import ImageFont`
と 
`__init__`でfont_msg 変数を新設して日本語フォントとポイント数を直接指定しました。

日本語フォントは、raspbian (日本語パッケージ)に入っている `japanese-gothic.ttf` を指定しました。
ポイント数は、10pt が DejaVuSansMono のdefaultっぽいのですが、
表示がイマイチだったので、11pt を選びました。
\#12ptだと、表示できる文字数が少なくなって残念になります。
\#ちなみに、小数点10.5ptとかは指定できません。エラーになります。
<b>⇒ もっと見やすいフォントがあるとよいのですが...</b>

`font_msg = ImageFont.truetype('/usr/share/fonts/truetype/fonts-japanese-gothic.ttf', 11)`
を追加しました。

さらに、`status` の `font` を変更します。
`#font=self._layout['status']['font'],`
のようにコメントアウトして、
`font=font_msg,`
上記で定義した `font_msg` に置き換えます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587146/9df1ed80-f3ed-486c-f3d0-ffce5728b6b0.png" width=75%>


~~~<b>⇒ もっと良いフォント定義の増やし方があると思うのですが、
　　ui/hw/xxx.py (表示デバイス)との連携があるため、
　　よい方法がみつけられていません。</b>~~~

⇒ ありがとう。`twitter:@dadav` さん。




### pycache の更新

```
root@pwnagotchi(your name):/usr/local/lib/python3.7/dist-packages/pwnagotchi/ui # python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import py_compile
>>> py_compile.compile("view.py")
'__pycache__/view.cpython-37.pyc'
>>> quit()
root@pwnagotchi(your name):/usr/local/lib/python3.7/dist-packages/pwnagotchi/ui # systemctl pwnagotchi restart
```

/var/log/syslog を確認してください。
指定ミスがあると、エラーが表示されますのでチェックできます。

---
## セリフの更新

pwnagotchi のセリフは `/usr/local/src/pwnagotchi/pwnagotchi/locale/jp/LC_MESSAGES/voice.po`
にあります。
とても頑張っているんだけれど、もう少し楽しくしたかったので、変更してみました。

### ご自分で行う方法
/usr/local/src/pwnagotchi/pwnagotchi/locale/jp/LC_MESSAGES/voice.po
を編集
英語と日本語が1:1になっているので、`msgstr`に気に入ったセリフへ変更できます。

```voice.po
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR 24534649+wytshadow@users.noreply.github.com, 2019.
...
msgid "ZzzzZZzzzzZzzz"
msgstr "すやすや～"

msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "僕、 ポーナゴッチです！"

msgid "New day, new hunt, new pwns!"
msgstr "ポーンしようよ。"

msgid "Hack the Planet!"
msgstr "ハックザプラネット！"
...
```

変更したら、コマンドラインで言語情報を更新します。

```
# cd /usr/local/src/pwnagotchi
# ./script/language.sh compile jp
# ./script/language.sh update jp
# cp pwnagotchi/locale/jp/LC_MESSAGES/voice.?o /usr/local/lib/python3.7/dist-packages/pwnagotchi/locale/jp/LC_MESSAGES
# systemctl pwnagotchi restart
```

voice.po と voice.mo をコピー (たぶん voice.mo だけでも良いと思いますが)

<b> 私が作ったものが、本線に登録されました。</b>

https://github.com/evilsocket/pwnagotchi/commit/54ffbbcb0b143d90e5f750d3b59b63adb0a223c8#diff-20b147eeb6cd7b3979fd22ea934ccedb

voice.po (テキストファイル)
voice.mo (script/language.sh compile 後のバイナリ)

```
$ scp voice.?o pi@10.0.0.2:/home/pi

# cp /home/pi/voice.?o /usr/local/lib/python3.7/dist-packages/pwnagotchi/locale/jp/LC_MESSAGES
# systemctl pwnagotchi restart
```

-----

## ハックザプラネット！