Posted in Pebble Twitterに投稿 6 Comments

 Pebbleのフォント/言語はパッケージで変更可能になっているということなので、母艦側のアプリから何かする処理があるだろうとAndroidのPebbleTimeアプリのapkファイルをばらして眺めていたところ言語パッケージ置き場のURLを発見。

 これをもとに少し探してみると、先ほど見つけたPebbleの言語パッケージ置き場のURLやパッケージファイルの構造が書かれているサイトがgithubにありました。
xndcn/pebble-firmware-utils

 言語パッケージは拡張子pbl(Pebble language fileですかね)のファイルで、pblファイルのpack/unpackスクリプトも上記のサイトに有る物を使用すれば可能です。
この情報をもとに自前の日本語言語パックを作ってみたので備忘録を兼ねて以下に作成方法を記載します。

作成環境

 作業はubuntu14.04で行いました。
・PebbleSDKの取得と展開
・翻訳対応が記載されたメッセージカタログファイルの変換処理にgettextパッケージに入っているmsgfmtとmsgunfmt
・フォントの生成にfreetype
・全体的にpython2系のスクリプト実行環境
が必要になります。
ubuntuでPebbleアプリのローカルビルド環境を作ってある場合はほぼそろっています。

他言語の言語パックを展開

 自前日本語化パックの作成には他言語の言語パックを展開、カタログファイルの変更とフォントを置き換えてパックし直すという手を使いました。
おそらく元になる言語パックはどれでも良いと思いますが、近そうな中国語の言語パックを使いました。

元になる言語パックの取得
pebble-firmware-utils/LANGUAGE.md
に記載されているURLの先から「lMG5CiT-zh_CN.pbl」を取得。

展開
 取得した言語パックは、xndcn/pebble-firmware-utilsにあるpbpack-tool.pyで展開します。
pbpack-tool.pyではSDKに入っているスクリプトを使うためSDKのインストールとPEBBLE_SDK_PATHの設定が必要です。

ここで、うちの環境ではSDK3.0に入っているpbpack-tool.pyを使用した場合にパッケージ展開関数がうまく動きませんでした。
かわりにSDK2.9を入れてスクリプト内のパスを修正したところ動作したので以下に少し書いておきます。
3.0と2.9でフォルダ構成が少し変わっているため、SDK2.9を使用する場合のみ以下の修正が必要です。
公式サイトからPebbleSDK-2.9をダウンロード。
$HOME/pebbleの下に展開したとします。
pbpack-tool.pyをエディタで開き、pbpack.pyのパスをSDK2.9に合わせて書き換えました。SDK3.0で問題無い場合は不用です。

12行目の
‘Pebble/common/tools’))

‘Pebble/tools’))
に変更。

1
2
$export PEBBLE_SDK_PATH=$HOME/pebble/PebbleSDK-2.9
$python pbpack-tool.py unpack lMG5CiT-zh_CN.pbl custom_pkg

これでcustom_pkgフォルダの中に中国語言語パックの中身が展開されます。

 展開後は19個のファイルが生成され、000はメッセージカタログ(poファイル)、001~018がフォントファイルです。
 

ファイルの編集

メッセージカタログ
 まずは000をメッセージカタログファイルに戻します。

1
msgunfmt 000 -o 000.po

中身は

1
2
msgid "%lu hours ago"
msgstr "%lu 个小时前"

というようにmsgidとmsgstrが並んでいるのでmsgstrの方を好きなように変更します。
完了したら元のバイナリ形式に変換

1
msgfmt 000.po -o 000

これはこれで置いておきます。

フォント
pebble-firmware-utils/LANGUAGE.md
の説明にあるとおり、本体の内蔵フォントは18個あり、中国語パッケージでは
・サイズ14のフォント2種/217文字 (001,002)
・サイズ18のフォント2種/9056文字 (003,004)
・サイズ24のフォント4種/9056文字 (005,006,007,008)
・サイズ21のフォント1種/12文字 (016)
・その他は空のファイル (009~015, 017,018)
となっておりサイズが同じファイルの中身は同一だとのことです。
001,002の中身には000.poに入っている文字があれば良さそうであること、016には月の表示に必要な文字が入って入れば良さそうであるということが書かれています。

TTFからPebble用フォントへの変換
 フォントは好きなTTFファイルからpebble用のpfoファイルを作成して使用します。
生成用のコマンドは
PebbleSDK-3.0/Pebble/common/tools/font/fontgen.py
に有り、以下のような引数を指定することで日本語部分のCodePointも含めた縦幅21のpfoファイルが生成されます。

1
$python fontgen.py --extended 21 mplus-1c-regular.ttf mplus_21.pfo

 mplusをこのスクリプトで処理するとグリフが指定した高さいっぱいまで入るように作成されるため、既存の英字フォントと並べた場合にかなりサイズが大きくなってしまいます。
かといってフォントの出力縦幅を短くすると、上に寄って表示されてしまうという問題に当たりました。

図にするとこんな感じ。
height_diff1
フォントの有効範囲がこのようになっており、上に詰めた位置から書かれているのが原因のようです。
height_diff2動作を見た感じからの推測ですが。

 同じ高さを指定して変換するとフォントを枠の高さいっぱいで生成してしまうので、既存の英字フォントに比べて大きくなりすぎ、小さくしてしまうと上に寄ってしまことになります。
フォントの下辺の位置を下にずらせれば解消できそうだったので、スクリプトに位置を調整する処理を追加してみたところ位置が合うようになりました。

 他のフォントでも上下位置をずらしたい場合があれば役に立つと思いますのでパッチを以下に置いておきます。
fontgen.py用パッチ

引数に–vertadjust xと入れると上下位置調整ができます。以下のような感じ。
これで全体的に3ドット下がります。

1
$python fontgen.py --extended 21 --vertadjust 3 mplus-1c-regular.ttf mplus_21.pfo

 このコマンドを使ってサイズ10,16,20,21ぐらいのフォントを作成しておきます。
作成したpfoファイルは、001~008までに名前を変えて先ほどのcustom_pkgフォルダのファイルと入れ替えます。
あとは実際の表示を見て合わないようであれば作り直して別のサイズを試すという感じです。

 今回使用したmplusフォントはJIS第一水準すべて(2965文字)と第二水準(全部で3396文字)のほとんどをカバーしているとのことなので文字数は6361文字弱ですが、ちょっと使ってみたところ豆腐にはならなかったので普通に使う分には大丈夫そうです。
文字数は中国語版の9056文字より少ないということもあって、001,002のファイルに含まれる文字数を削ったりしていません。

 fontgen.pyには、出力文字を選択できるオプションがあるのでサイズを極力削減したい場合にはこれを使うと良いかと思います。未確認ですが、サイズの問題で本体にインストールできないということが発生した場合も必要になると思います。
今回は使っていないので説明は割愛しますが、使う方はスクリプト内を見ると分かるかと。

 ちなみにカスタムフォントを使うサンプルがpebble-examples/feature-custom-fontにありますが、ビルドの際にこのfontgen.pyを使用してアプリ埋め込みフォントを作成しているので、先に自分でpfoファイルを作成しておくと日本語が入ったpbwファイルが作成できるはずです。
とはいえ公式で配布してもらうためにはpbwファイルのリソースサイズは256kbyte制限が有るので、あまり文字数は入れられないと思います。野良パッケージなら問題無いようですが。
この辺の情報はリソースを山のように詰めてローカルビルドした際のビルドログを参照。
 

pblパッケージ化とインストール

パッケージ化
 ファイルが揃ったら、パッケージ化は以下のコマンドで可能です。
mplus_JP.pblという名前でcustom_pkgフォルダの中身をパッケージする場合。

1
$python pbpack-tool.py pack mplus_JP.pbl custom_pkg/*

インストール
 これまでの手順で作成したpblファイルをAndroid端末で開こうとすると対象アプリとしてPebbleTimeアプリが出てきます。
選択すると言語パックのインストール確認画面になるので、問題なければOKを押してPebbleにインストール開始。
転送,インストール中もPebble側の表示は何も変わりませんが端末側の表示が100%になってから設定画面などを見ると言語設定とフォントが変わっています。

pbjp

なお一度000に問題があるパッケージを作ってPebbleに送ってしまったのですが、その際には標準の英語設定が使用されていたので、言語パックのミスで起動不能になるということはなさそうです。たぶん。

サンプル
というわけでせっかくなので作ったものを以下に置いておきます。
mplus03_JP.pbl
PebbleTimeしか持っていないので初代Pebbleで使えるかは不明です。
[2015/8/6追記]
v3.2に暫定で対応した物をこちらに置いてあります。
PebbleTime v3.2 暫定対応日本語パック

これには以下のコマンド(パッチ済み)で変換したフォントが入っています。

1
2
3
4
5
6
7
8
9
10
11
001,002
$python fontgen.py --extended 10 --vertadjust 3 mplus-1c-regular.ttf mplus_10p3.pfo

003,004
$python fontgen.py --extended 16 --vertadjust 2 mplus-1c-regular.ttf mplus_16p2.pfo

005,006
$python fontgen.py --extended 20 --vertadjust 4 mplus-1c-regular.ttf mplus_20p4.pfo

007,008
$python fontgen.py --extended 21 mplus-1c-regular.ttf mplus_21.pfo

mplusフォントの作者に改変、再配布可で公開してくれていることを感謝。
M+ OUTLINE FONTS

 000のカタログファイルは、以前から日本語化パッチを作成されているPebble 日本語言語パックの内容とiPhoneとAndroidの日本語を参考に適当に設定しました。

 文字数が長いと右が「…」になってしまうため、カタカナはすべて半角にしてあります。全角と半角が混ざるのが気に入らなかったのですべて半角カナです。気に入らない場合は修正してください。
なおどこで使われているのか不明な文言や、翻訳しなくても良さそうなものは英語のままにしてあるものが多数あります。
 

その他

 Notoフォントを使用した物がPebble 日本語言語パックで公開されているので、Notoフォントが好きな場合はそちらを使用すると良いかと思います。文字幅的にはNotoフォントの方が良いような気がしないでもないです。
上のサイトでは初代Pebbleの頃からサポートされているようなので、翻訳の質も良いのではないかと思いますし。

・iOS版のPebbleTimeアプリはどうもpblファイルを処理する部分がないのか、インストール処理が開始されません。インストールの確認はAndroidのPebbleTimeアプリでのみ行いました。
今のところ問題なく動作していますが、現在以下の点が確認不足です。

・言語パッケージにサイズ制限はあるのか
– 現在約1.2MB程度のファイル(上のサンプル)を作成して問題なくインストールできることは確認しています。中国語のパッケージが有るということはそこそこのサイズが入ると思われ、今回mplusフォントから各種サイズを作成してpblファイルを作ってみましたが、特に文字を削らなくてもインストール可能でした。

・インストールしたフォントはメニュー以外で使用した場合にサイズ的にどうか
– この部分はまだあまり確認できていません。この画面のこのフォントがずれてるとか、何かあればコメントと可能ならスクリーンショットがもらえると助かります。

2015年6月21日