iGoogle ガジェットでのローカライズについて

iGoogle ガジェットではベースディレクトリ直下に
“ja_ALL.xml”のように”<言語>_<国>.xml”を作ります。
ワイルドカードとして”ALL”が使えます。
なので”ALL_ALL.xml”を作るのもありです。
むしろ”ALL_ALL.xml”を作って置いた方が良いと思います。

それでローカライズ毎のXMLファイルの中身はというと
下記のように記述してあげます。
 <messagebundle>
  <msg name=”foo”>bar</msg>
 </messagebundle>

メッセージを取得する方法は下記のように行います。
  var pref = new _IG_Prefs(__MODULE_ID__); // new gadgets.Prefs();
  var msg = pref.getMsg(“foo”);

Adobe AIRでのローカライズについて

Adobe AIRでは専用の拡張APIを持っていますので
今までとはちょっと違います。
まずベースディレクトリの下に”locale”ディレクトリを作成します。
“locale”ディレクトリの下に”ja”などの
言語ディレクトリを作成します。
言語ディレクトリの下には”localizedStrings.properties”のように
ローカライズ毎のプロパティファイルを置いておきます。

なのでプロパティファイルの中身は下記のようになります。
 foo =bar

そして取得の方法は下記のように行います。
getStringメソッドの第1引数に”言語”、
第2引数にプロパティファイルで記述したキーを指定します。
 var msg = air.Localizer.localizer.getString(“ja”, “foo”);

Mac OS X Dashboard ウィジェットでのローカライズについて

Mac OS X Dashboard ウィジェットでのローカライズについてです。

Mac OS X Dashboard ウィジェットではベースディレクトリの下に
“ja.lproj”のように”<言語>.lproj”ディレクトリを作成します。
この下にローカライズされたファイルを置いておきます。
ファイルのエンコードは”UTF-16,Big-Endian”です。
UTF-8でも大丈夫だと思うけれども
“UTF-16,Big-Endian”にしておいた方が無難です。

ローカライズされたメッセージの取得については
 “ローカライズについて”
 “Opera ウィジェットでのローカライズについて”
を参照してください。

Opera ウィジェットでのローカライズについて

Opera ウィジェットでのローカライズについてですが
Opera ウィジェットではないです。
Opera ウィジェットの方ではなにもしてくれません。
なので自前で行うしかないです。

どうやって自前で行うかというと
jsファイルを言語ごとに分けておいて
表示したい言語によってそれを切り分けます。
対象となるエレメントを取得して削除しちゃいます。
そして読込みたいエレメントを追加します。

こんな風にsetLocalizedを呼んで言語ファイルを変更して
getStringを呼んでローカライズメッセージを取得します。
下記のような形で。

 this.LANG_NAME     = localizedStrings;
 this.LANG_NAME_JS  = this.LANG_NAME + “.js”;
 this.ROOT_LOCATION = location.toString().substring(0, location.toString().lastIndexOf(“/”)) + “/”;

 /**
  * ローカライズの設定。
  *
  * @param <string> lang 言語名
  */
 function setLocalized(lang) {
  if (lang == null) {
   throw new Error(“lang is null”);
  }
  if (this.gadget.isAIR()) {
   return;
  }

  var jsObjList = document.getElementsByTagName(“script”);
  for (var cnt = 0; cnt < jsObjList.length; cnt++) {
   var jsSrc = jsObjList[cnt].src;
   if (jsSrc.lastIndexOf(this.LANG_NAME_JS) < 0) {
    continue;
   }

   var jsSrc = null;
   if (lang == “ja”) {
    jsSrc = this.LANG_NAME_JS;
   } else {
    jsSrc = lang + “/” + this.LANG_NAME_JS;
   }

   if (
    jsObjList[cnt].src == jsSrc
    || jsObjList[cnt].src == this.ROOT_LOCATION + jsSrc
   ) {
    break;
   }

   // 今のjsを削除
   var headObj = jsObjList[cnt].parentNode;
   headObj.removeChild(jsObjList[cnt]);

   // 新しいjsを追加
   var jsObj = document.createElement(“script”);
   jsObj.src    = jsSrc;
   jsObj.onload = initSettingData;
   headObj.appendChild(jsObj);
   break;
  } // for (var cnt = 0; cnt < jsObjList.length; cnt++)
 }

 /**
  * ローカライズされた文字列の取得。
  *
  * @param  <string> キー
  * @return <string> ローカライズされた文字列
  */
 function getString(key) {
  if (key == null) {
   throw new Error(“key is null”);
  }

  var ret = null;
  try {
   ret = localizedStrings[key];

  } catch(ex) {
  }

  if (ret == null || ret === undefined) {
   ret = key;
  }

  return ret;
 }

Windows サイドバーガジェットでのローカライズについて

Windows サイドバーガジェットでのローカライズについてです。

Windows サイドバーガジェットではベースディレクトリの下に
“js-JP”のように”<言語>-<国名>”のディレクトリをつくって切り分けます。
画像など同じファイルはベースディレクトリの下においてあげます。
画像ディレクトリにアクセスしたいときには特に気にせずに
言語ごとに分けたサブディレクトリからアクセスできます。
Windows サイドバーガジェットのほうでなかったら
ベースディレクトリを再検索してくれるので。

卒業のCM

昨日もちろん”卒業”を購入しました。

そして一日中聞いていました。

 

そこでふと思ったのが”卒業”のCMってみたことないなって。

いつもテレビを見ない方なのでだからかもしれないけれども。

なので長渕剛 公式ホームページよりCMをみました。

下記のサイトです。

  http://www.nagabuchi.or.jp/new_contents/graduate/tv.html

 

なんかおかしいです。。

悪くないんだけれども。。

“卒業”の世界観と全くマッチしていないのです。

大丈夫かな?

ローカライズについて

国際化したガジェットをつくって
世界のみんなに使ってもらおうとしたときは
日本語バージョンと英語バージョンの
メッセージだけを変更すれば基本OKです。
文字長がかわるのでレイアウトを確認しないといけないですが。

どうやって実現するかというと
各ガジェットでローカライズ対象ディレクトリが大体あります。
そこにファイルをおいておきます。
ファイルを探そうとしたときに対象ディレクトリになかったら
ローカライズ対象ディレクトリを探してくれるので
それでローカライズを行うことができます。

ローカライズするメッセージは
JavaScriptのファイルとします。
そしてメッセージを入れておく配列をつくり
配列の連想キーにメッセージを取得するキーとなる文字列、
値にそのメッセージを入れておくのがお勧めです。

そして取り出すときにはそのJavaScriptの配列に対して
メッセージキーをいれて表示したいメッセージを取得します。

言葉で表現するのは難しいですね。
まあ、こんな感じです。
 ローカライズメッセージのJavaScript:
  [<ベースディレクトリ>/<ローカライズ対象ディレクトリ>/localizedStrings.js]
   var localizedStrings = new Array();
   localizedStrings[“foo”] = “bar”;

 呼び出しJavaScript:
  [<ベースディレクトリ>/main.js]
  var msg = localizedStrings[“foo”];

setTimeoutについて

イベントを受け取って別スレッド処理を行いたいときなど
タイマーのsetTimeout、setIntervalなどを使用するかと思いますが
Google デスクトップ ガジェットとYahoo!ウィジェットだけは
使えないのです。

Google デスクトップ ガジェットではviewオブジェクトの配下に
setTimeoutがあり第1引数には通常、呼び出したいメソッド
または処理を記述した文字列を渡すのですが
文字列しか受け取ってくれません。

逆にAdobe AIRではメソッドしか受け取ってくれませんので
これも要注意です。

Yahoo!ウィジェットではTimerオブジェクトを使用します。
こんな感じで。
 Google デスクトップ ガジェット:
  iid = view.setTimeout(‘foo()’, 100);

 Yahoo!ウィジェット:
  var timer = null;
  if(timer != null){
   timer.ticking = false;
   timer.reset();
  }
  if(timer == null){
   timer = new Timer();
   timer.interval = 100 / 1000; // sec
   timer.onTimerFired = checkUpdate;
  }
  timer.ticking = true;

クリップボードへのコピー

クリップボードへのコピーを行い時に
Windows サイドバーガジェット、Mac OS X Dashboard ウィジェット、
Adobe AIR、iGoogle ガジェット(IEでみたときのみ)、
Yahoo!ウィジェットでは拡張APIをつかって行えます。
iGoogle ガジェット(IEでみたときのみ)は
Windows サイドバーガジェットと同じ方法なんだけれどもね。

Mac OS X Dashboard ウィジェットは拡張APIというよりも
シェルにアクセスできるのでシェルを通じてのアクセスになります。
もちろんマニフェストファイルに
 <key>AllowSystem</key>
 <true />
と記述しておかないとセキュリティエラーで動かないです。

それ以外ではそのくらいの拡張API作っておいてもよさそうなんだけれども
やるのであればFlash経由で
クリップボードへアクセスするしかないようです。

そのやり方は下記です。
 Windows サイドバーガジェット:
  clipboardData.setData(“Text”, value);

  clipboardData.getData(“Text”);

 Mac OS X Dashboard ウィジェット:
  widget.system(“/bin/echo -n ‘” + value + “‘ | /usr/bin/pbcopy”, null);

  value = widget.system(“/usr/bin/pbpaste”, null).outputString;

 Adobe AIR:
  var copyObj = air.Clipboard.generalClipboard;
  copyObj.clear();
  copyObj.setData(air.ClipboardFormats.TEXT_FORMAT, value);

  var pasteObj = air.Clipboard.generalClipboard;
  value = pasteObj.getData(air.ClipboardFormats.TEXT_FORMAT);

 Yahoo!ウィジェット:
  system.clipboard = value;

  value = system.clipboard;

 

透過PNGが透過されない

IE6では透過PNGをサポートしていなくて
苦労なさっている人も多いと思います。
IE7になってやっと対応してくてもちろん
Windows サイドバーガジェットも対応しているんだけれども
中途半端です。
ときどき透過PNG画像のはじっこが赤紫になってしまいます。
ならないのもあるし、なるのもあるしどうしてなのか不明です。

Silverlight2.0を使っての
Windows サイドバーガジェットを作っているときに
気づいたんだけれども背景を完全に透過にしたら赤紫になりました。
なんででしょうね。。

ちなみにiGoogleではIE6の透過PNG対応として
iepngfixというものを導入して
ごまかしています。
まったくシェアが多いから無視できないので苦肉の策です。。