pwnagotch v.1.4.3 からの日本語化


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

最新版

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

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


v 1.4.3 の場合の日本語表示

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

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

ここから v 1.4.3の対応方法

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" が日本語対応していないので、□(別名豆腐)表記になります。(日本語が出ません)

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

$ ssh [email protected]

$ 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を指定しています。
これを日本語対応の別のフォントにすれば良いのではと思いました。
でも、これを変えるとせっかくの の表示が壊れてしまいます。
⇒ "フォントの達人"ならば力業で何とかすると思うのですが...

私は別アプローチを取りました。

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だけを、日本語フォントに指定しました。(なので、暫定です。)

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

# 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とかは指定できません。エラーになります。
⇒ もっと見やすいフォントがあるとよいのですが...

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

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

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

⇒ ありがとう。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 [email protected], 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 だけでも良いと思いますが)

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

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

$ scp voice.?o [email protected]:/home/pi

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

ハックザプラネット!