ロケール(後編)

2009 年 10 月 30 日

webOS のシステムロケールを自由に変更出来ないのは、キャリアの縛りであると仮定した場合、普通にコードを書いてみたところで、これに太刀打ち出来るものでは有りません。

そこでボクは考えました、システムロケールというのは一度設定すれば、ずっとその状態を記憶します、つまりこれはマシンの「不揮発性メモリ」か「ファイルシステム」にその情報を残しているからなのです。

もし「不揮発性メモリ」に残してるのなら、その場所を探し出すのは、残念ながらほぼ不可能です、でも「ファイルシステム」に残しているのなら、上手く行けばそれを探し当てる事が出来るかも知れません。

ボクはダメ元で、有るのか無いのかも判らない、そのファイルを探してみる事にしました。
そして幸運にもボクは、数千にも及ぶファイルの中から、それを探し当てる事が出来たのです。

それでは皆様、大変長らくお待たせいたしました。
webOS のシステムロケールをキャリアの縛りに関わらず、自由に変更出来る方法についてレポートいたします。

■作業手順

(1) ボクが見つけたそのファイルは systemprefs.db という名前のデータベースで、以下のフォルダに存在していました。

/var/luna/preferences

まず、このファイルをPCに持って来ます。

(2) データベースを編集するソフト SQLite Database Browser を以下のページからダウンロードして、PCにインストールします。

http://sourceforge.net/projects/sqlitebrowser/files/

※ダウンロードするのは sqlitebrowser-1.3-win.zip です

(3) SQLite Database Browser で先の systemprefs.db を開いてください。

image22

(4) 書き換えるのは43行目のココ、何とこれが webOS のシステムロケールを決定する、大元の情報だったのです。

image35

(5) ココを { “languageCode”: “ja”, “countryCode”: “jp” } と書き換え systemprefs.db を保存します。

image4

(6) systemprefs.db をPreに書き戻し本体をリブートします。

以上の作業でこんな風に、システムロケールが ja_jp になりました。
hello_2009-30-10_171034

■アプリの挙動変化

実を申し上げますと、ホントのお楽しみはココからなんです。
システムロケールが ja_jp になった事で、各アプリの挙動に何らかの変化が起きているハズです。
アプリをひとつひとつチェックしてみましたところ、以下に示す3つの大きな変化を確認出来ました。

☆挙動変化1

予想通り webブラウザの吐き出す情報が ja_JP になりました。
これにより、複数言語のコンテンツを自動振分けしているようなサイトでは、
日本語のコンテンツが優先されるようになります。
browser_2009-30-10_170453

例えば facebook のログイン画面、
もともと英語だったものが、日本語で表示されるようになりました。
browser_2009-30-10_1705181

☆挙動変化2

Google Maps の初期起動画面、
もともと北米地図だったものが日本地図になりました
maps_2009-30-10_170124

操作画面やメニューについても、
もともと英語だったものが、日本語で表示されるようになりました。
maps_2009-30-10_170241

☆挙動変化3

Doc View で単純な日本語Word文書に限り、正常に読めるようになりました。
5ヶ月前、HALさんが試してくださった画像と比べると、その差は歴然。
http://www.hal9.sakura.ne.jp/fig/Pre090609A037.jpg

docviewer_2009-30-10_170026

※(注1) 文書体裁の凝ったものは、やはり文字化けします
※(注2) Doc Viewのフォントは少し細工してます
※(注3) この文書、ロケール変更前はエラーで開く事さえ出来ませんでした
※(注4) Excel と PowerPoint については、まだ文字化けします

以上が、システムロケールを ja_jp にしたことで、確認できた大きな変化です。
これ以外にも、まだボクが気付いていない、細かな変化が有るかも知れません。

ロケール(前編)

2009 年 10 月 29 日

ロケールとはOSが扱う「言語」と「国」を規定するものであります。
Palm Pre Sprint版においては en_us(英語_米国)と es_us(スペイン語_米国)、2つのロケールがサポートされております。

これに jp_jp(日本語_日本)のロケールを追加したい、或いは入れ替えたい、果たしてそんな事が可能なんでしょうか?

webOS のロケール決定メカニズムとは如何なるものなのか?
更にディープな部分へと解析を進めて行きました。

■ランゲージコードとカントリーコード

皆さん良くご存知の通り、旧PalmOSの時代、日本のロケールは jpJP でした。
ボクは webOS でも jp_jp で良いだろうと思っておりましたが、どうもコレは間違いだったみたいです。

調べましたところ ISO 639 では、以下のように規定されておりました。

言語コード:ja → 日本語

また、ISO 3166-2 では以下のように規定されておりました

国コード:JP → 日本

つまり、日本のロケールは jp_jp では無く、ja_jp が正しいコードになります。

■旧来手法による検証

Palm Mojo Framework の API リファレンスを読んでみますと、現在のシステムロケールを取得するAPIとして、Mojo.Locale.getCurrentLocale() という関数が有りました。

http://developer.palm.com/palm-sdk/jsdoc/symbols/Mojo.Locale.html

旧PalmOSでも、これと似たようなAPIが有りました、J-OS や JaPon では、このAPIをフックする事により、システムロケールを jpJP と詐称する手法が用いられました。
つまりホントは英語版で enUS なのに「システムロケールは jpJP だよ~」と嘘をつく訳ですね。
これと同じ手法が webOS でも使えるのではないかと、ボクは考えたのです。

捜しましたところ Mojo.Locale.getCurrentLocale() 関数は、以下のモジュール内に有りました。

/usr/palm/frameworks/mojo/builtins/palmInitFramework200_18.js

もちろん関数自体が java script で書かれていますので、ソースリスト丸見え、テキストエディタで書き換え自由な訳です、ボクは簡単に出来るものと信じておりました。

ところがです、この関数をいくら弄ってみても、ロケールを詐称する事が出来ないのです、これには悩みました。

それで、Pre に標準搭載されているアプリ側のソースも調べてみたんです。
すると、どのアプリからも、この関数を呼んで無いじゃあ~りませんか、こりゃ完全にやられました(TT)

■webOSのサービスによる検証

そこで次にボクは Laungage picker のソースを解析し、この中でロケールを切り替えている処理部分を抜き出して、簡単なテストアプリを作ってみました。

以下は、そのテストアプリの画面と、その部分のソースです、画面のボタンを押すと、webOSのサービスを呼ぶ方法でロケールを切り替えるという、極めて単純なアプリであります。

hello_2009-29-10_203744


var languageCode = “ja”;
var countryCode = “jp”;
this.setLocaleReq1 = new Mojo.Service.Request(”palm://com.palm.systemservice”, {
method: ’setPreferences’,
parameters: {”locale”:{”languageCode”:languageCode,”countryCode”:countryCode}},

});

それで、このテストアプリの

var languageCode = “ja”;
var countryCode = “jp”;

という部分を色々変えてみてテストを行いましたところ、確かに en_us または es_us の場合は、ロケールを切り替える事が出来ました。
ただし、それ以外のロケールには、いくらやっても切り替わりません。

これはどう考えても en_us と es_us ロケール以外は変更出来無いようにしているみたいです。
「これはキャリア(Sprint)の縛りなのか?」そんな憶測がボクの頭の中をよぎりました。

そんな訳で、まさに八方塞がり、もう何日もこの壁に突き当たったまま、ボクは先に進む事が出来なくなってしまったのです。

しかし、運命の女神は、まだボクを見捨てた訳ではありませんでした。

つづく

リージョン

2009 年 10 月 25 日

ここで申し上げる「リージョン」とは、国ごとの通貨記号や、数値、日付、時刻のフォーマットなどを定義したデータテーブルの事を指します。
このデータテーブルは、旧PalmOS の時代には Boot モジュール内に存在しておりましたが、webOSでも同様の仕組みが実装されております。

リージョンは原則、フォーマット(並び方)について定義しただけのものであり、ユーザが自由に設定出来ます。
しかしながら、更に詳細な日付や時間の表示内容について定義されたテーブルが、これとは別に存在しており、こちらの方はシステムのロケールに連動して決め打ちされます。

では、webOSにおけるリージョンの解析とカスタマイズ、そして、その成果として Calendar アプリの日本語ローカライズについてレポートいたします。

■リージョンの解析

webOSにおけるリージョンのデータテーブルには、Regional Settings に連動するものと、ロケールに連動して決め打ちされるものが有ります。

☆ Regional Settings に連動するもの

こちらのデータテーブルは以下のフォルダに存在します

/usr/palm/frameworks/mojo/submissions/200.18/formats

国ごとに、拡張子 json のファイルで格納されております、もちろん jp.json (日本)のテーブルもココに有ります。
以下は jp.json のファイルの中身であります。

{
“numberTripleDivider”: “,”,
“numberDecimal”: “.”,
“currencyPrepend”: “¥”,
“currencyAppend”: “”,
“percentageSpace”: “false”,

“fullDate”: “yyyy年M月d日EEEE”,
“longDate”: “yyyy年M月d日”,
“mediumDate”: “yyyy/MM/dd”,
“defaultDate”: “yyyy/MM/dd”,
“shortDate”: “yy/MM/dd”,
“dateFieldOrder”: “ymd”,

“fullTime24″: “H時mm分ss秒”,
“fullTime12″: “H時mm分ss秒”,
“longTime24″: “HH:mm:sszzz”,
“longTime12″: “hh:mm:ss azzz”,
“mediumTime24″: “H:mm:ss”,
“mediumTime12″: “h:mm:ss a”,
“defaultTime24″: “H:mm:ss”,
“defaultTime12″: “h:mm:ss a”,
“shortTime24″: “H:mm”,
“shortTime12″: “h:mm a”,
“dateTimeFormat” : “DATE TIME”,

“is12HourDefault”: “true”,
“firstDayOfWeek”: 0
}

 

 

☆ ロケールに連動して決め打ちされるもの

こちらのデータテーブルは以下のフォルダに存在します

/usr/palm/frameworks/mojo/submissions/200.18/resources

国ごとに、更にフォルダ分けされて格納されております、残念ながら jp_jp (日本)のフォルダは有りません。
今の段階では、en_us フォルダの中に有る datetime_table.json を書き換えることにします。
以下に書き換え後の datetime_table.json のファイルの中身を示します。

{
“long”: {
“day”: ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"],
“month”: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
},
“medium”: {
“day”: ["日", "月", "火", "水", "木", "金", "土"],
“month”: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]
},
“short”: {
“day”: ["日", "月", "火", "水", "木", "金", "土"],
“month”: ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"],
“date”: ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
"31"]
},

“single”: {
“day”: ["日", "月", "火", "水", "木", "金", "土"],
“month”: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
“date”: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
"31"]
},

“relative”: {
“yesterday”: “昨日”,
“today” : “本日”,
“tomorrow” : “明日”
},

“am”: “AM”,
“pm”: “PM”
}

 

 


追記:2009/11/14
リージョンの日本語化について
(1)まず以下のフォルダ内に ja_jp というフォルダを新しく作ります
/usr/palm/frameworks/mojo/submissions/***.**/resources

ご注意:***.**という部分はバージョン番号です、お使いのマシンにより変わります

(2)以下より datetime_table.json をダウンロードし、先の ja_jp フォルダにコピーします
datetime_table.json のダウンロード

(3)マシンをリブートします

追記:2009/11/24
Symキーで表示される記号の入力パネルについて
上で作りました ja_jp フォルダに、以下のファイルもコピーしてください。
そうしないとSymキーを押しても記号の入力パネルが表示されません、
なお、これらのファイルは en_us フォルダに入っているものをコピーすれば良いでしょう。

alternatechars_fulltable.json
alternatechars_fulltable_azerty.json
alternatechars_fulltable_qwertz.json
alternatechars_table.json
alternatechars_table_azerty.json
alternatechars_table_qwertz.json

■Calendarアプリの日本語ローカライズ

リージョン解析の成果として、Calendarアプリの日本語ローカライズ作業を行いました、これで、日本人が使用するにあたって、全く違和感の無いアプリに変身いたしました。

calendar_2009-25-10_172233

calendar_2009-25-10_172243

calendar_2009-25-10_172251

calendar_2009-25-10_172400

calendar_2009-25-10_172411

なおサンプルとして入力しました予定は、すべてフィクションです m(_ _)m

上で作りました ja_jp フォルダには、以下のファイルもコピーしてください

alternatechars_fulltable

ないと記号の入力パネルが表示されません
/usr/palm/frameworks/mojo/submissions/***.**/resources

カスタマイズ環境構築

2009 年 10 月 22 日

順番が後先になってしまいましたが、今回は Palm Pre をカスタマイズする為の環境構築について述べます。

これまでの記事で「ソースは普通のテキストエディタで編集出来る」と申し上げてきましたが、今のところPreには、そのような用途向けのエディタアプリは存在しません、ですから、一旦PCに持って来て → 編集して → 書き戻す、という方法でソースを書き換えております。

とりあえず、ボクの場合は novaterm と WinSCP の2つのツールを併用して、書き換え作業をしております。

脱獄りんごやN810のように、root権限でsshを使えれば WinSCP だけで済む話なのですが、残念ながら Palm Pre の場合は、user権限でしかsshを使えないようです。 

※ root権限でsshする方法をご存知の方、いらっしゃいましたら、どうかお教えください m(_ _)m

それでは、Windows PC で、novaterm と WinSCP を使えるようにして、ソースを書き換える作業方法についてレポートいたします。

■novaterm を使えるようにしよう

novaterm は以下よりダウンロード、解凍されたファイルを適当なフォルダへコピーします

novaterm
http://tkgeisel.com/stuff/novaterm-1.zip

Pre 本体のディスクトップ(何もアプリを起動していない状態)から、キーボードで以下のコナミコマンドを入力します

コナミコマンド
upupdowndownleftrightleftrightbastart

すると、非表示になっていた隠しアプリのアイコンが現れます、マシンは DeveloperMode となります

2009-22-10_182745

Pre 付属のUSBケーブルで PC と接続します

「Just Charge」ボタンを選択します

2009-22-10_182800

novaterm を起動し、Connect ボタンを押します
以下のプロンプト(root@castle)が表示されたら成功です

 image32

■WinSCP を使えるようにしよう

novaterm のプロンプトから、以下の呪文を入力します、何だか良く判りません(笑)、これで ssh server が Pre に導入されます
※詳しい解説はココを見て → http://www.webos-internals.org/wiki/Next_steps

呪文は1行ずつ入力してくださいね、どのタイミングか忘れましたが、途中で2回程質問して来ます。

1つ目は、確かこんな感じの質問でした
1.EVDO/WiFi, 2.EVDO, 3.WiFi ?
※ ボクはWiFiを選択しました

2つ目は「ユーザ名」と「パスワード」の入力でした
※ ボクはユーザ名をminiとしました
※ パスワードは「1234」とか、いい加減なものでは駄目で、真面目に入力しないと受け付けてくれません

cd /tmp
wget http://gitorious.org/webos-internals/bootstrap/blobs/raw/master/optware-bootstrap.sh
sh optware-bootstrap.sh
source /etc/profile.d/optware

cd /tmp
wget http://gitorious.org/webos-internals/bootstrap/blobs/raw/master/quilt-bootstrap.sh
sh quilt-bootstrap.sh

呪文を全部入れ終わったら、Pre を再起動してくださいね

次に、PC側にssh Clientをインストールします
以下のページからWinSCPを入手し、PCへインストールしてください
http://www.tab2.jp/~winscp/

WinSCP の設定です、Pre のIPアドレスは WiFi Preferences で確認出来ます、ポート番号は 222 としてください

image11

無事接続出来るようになりましたか?、これでカスタマイズ環境の構築は完了です

image2
 

■何も恐れる事はありません、ソースを書き換えてみよう

ソースを書き換える手順を説明します
例として「webOSで日本語入力成功!(暫定版)」の記事中で紹介した、◎+Aショートカットを変更する方法を紹介します。

(1) WinSCPで書き換えるファイルをPCへ持って来ます
/usr/palm/frameworks/mojo/builtins/palmInitFramework200_18.js

(2) 適当なテキストエディタで、上記ファイルの該当部分を書き換えます

(3) novaterm で以下のように入力します
mount -o remount,rw /
cd /usr/palm/frameworks/mojo/
chmod 0777 builtins
cd builtins
mv palmInitFramework200_18.js palmInitFramework200_18.js$

(4) WinSCPで先のファイルを Pre へ書き戻します

(5) Pre を再起動します

如何でしょうか?、これで ◎+A が ◎+Enter に変わりましたか?

旧PalmOS で ARMコードにパッチを当てる時など、いつもドキドキしたものです(だって、失敗したら最悪リセットループですもの)
それに比べれば webOS はホントにお気軽です、java script をゴニョゴニョする程度では、余程の事をしない限り、マシンが死亡する事なんて無いのでは・・・
皆さんも Pre を入手されたら、色々とチャレンジしてみてくださいね。