2013年8月31日土曜日

Pebbleでにほんご

Pebbleが届いたー!

Pebble SDK(1.12)であれこれいじってみたら、日本語を含む非英語も表示できることがわかった。
ただし、アルファベットや数字も含めて、表示できる文字の種類は255が上限になるっぽい。

方法はこんな感じで、標準のSDKの修正が必要となる。
  1. fontgen.pyをいじって、グリフの書き出し処理に、日本語をねじこむ
  2. 普通にアプリを作る
  3. アプリの中で日本語のカスタムフォントを使って日本語を表示させる

ポイントはfontgen.py(sdk/tools/font/fontgen.py)の修正で、アプリのビルド時には、こいつがリソースフォルダのフォントファイル(*.ttf)からグリフ(たぶんビットマップ)を抽出して、*.pfoというファイルに出力している。で、最終的に*.pfoがアプリにバンドルされるため、こいつにうまく日本語フォントを出力してもらうようにすることが必要になる。

fontgen.pyの130行目あたりでは、こんなふうにMIN_CODEPOINT(0x20)からMAX_CODEPOINT(0xffff)までをループして、ひとつずつグリフを内部的テーブルに追加していってるのだけど、グリフの数が255になるとループから抜けるようになっていて、コメントによるとハード的な制限だとか。
----------
for codepoint in xrange(MIN_CODEPOINT, MAX_CODEPOINT + 1):
    # Hard limit on the number of glyphs in a font
    if (self.number_of_glyphs > 255):
        break
    
    character = unichr(codepoint)
    ...
    glyph_bits = self.glyph_bits(character)
    ...
    self.number_of_glyphs += 1
    glyph_table.append(glyph_bits)
----------

試しに、使わないであろう文字をスキップして、ひらがなカタカナを読み込むようにfor文を変えてみる。
----------
for codepoint in range(MIN_CODEPOINT_LATIN,         # 0x20
                       MAX_CODEPOINT_LATIN + 1      # 0x7e
             ) + range(MIN_CODEPOINT_HIRAGANA,      # 0x3041
                       MAX_CODEPOINT_HIRAGANA + 1   # 0x3096
             ) + range(MIN_CODEPOINT_KATAKANA,      # 0x30a1
                       MAX_CODEPOINT_KATAKANA + 1): # 0x30f6
----------

でてきた

ということで、Pebbleは内部的にUnicodeを扱うことができて、非常に限定的ではあるけども、非英語の表示も可能ということがわかった。
実際公式FAQには、他言語のアプリの開発もできるようになる予定と書かれているし、通知機能の多言語化も匂わせている。

<http://help.getpebble.com/customer/portal/articles/964047-general-questions#Languages>
----------
Can Pebble display notifications in other languages?
  • Pebble is currently only set up for English, but developers will be able to develop apps to support other languages. We are still looking into how various languages (and what versions – eg. simplified vs traditional Chinese) will display for basic notifications.
----------

"how various languages..." なんて書いているところから、Unicode全体をサポートするのはリソースが限られていて無理なのかもね。