Cocoa Break Logo Top Soft Develop  脱力空間 Logo
Apple Web Badge
made by mi

概要 翻訳 ソース リンク がらくた

概要 Examples ADC Samples 3rd Parties etc CBOriginals

HelloWelt

以下は、Mac OS X 10.4.11 上の Xcode 2.5 で説明しています。このウィジェットは、Hello Worldを修正したものです。Hello Worldで解説したことは繰り返しませんので、そちらを参照してください。

目次:
1 ウィジェット
2 ファイル構成
3 InfoPlist.strings
4 HelloWelt.html
5 HelloWelt.css
6 HelloWelt.js
7 まとめ

1 ウィジェット

HelloWelt は、Finder における表示から違います。「こんにちは、世界.wdgt」または拡張子が隠されていれば「こんにちは、世界」だけです。インストールして起動すると、日本語で「こんにちは、世界!」という文字列が表示されたウィジェットが表示されます。文字列の下には日本語であることを示す Japanese が表示されています。ウィジェットの機能としては何もなく、ただそれだけです。

2 ファイル構成

このサンプルのファイル構成は以下のようになります。

さまざまな言語のローカル化用フォルダがあるのがわかります。ここでは日本語の ja.lproj を示していますが、他言語のものも同じ構成です。Hello World とは違って、CSS と JavaScript ファイルがあるのに注意してください。情報プロパティリスト自体は、Hello World とほとんど同じです。

3 InfoPlist.strings

Info.plist が Hello World とほとんど変わらないのに、Finder 上のパッケージ名が変わっていました。これを指定しているのが、言語フォルダ内にある InfoPlist.strings です。

InfoPlist.strings
/* Info.plist キーのローカル化されたバージョン */ CFBundleDisplayName = "こんにちは、世界";

ここでバンドルの表示名を指示しています。このウィジェットでは、ウィジェット内に同じような文字が表示されますが、ここで指定しているのはあくまでバンドル自体の表示名であることに注意してください。ちなみに、フランス語フォルダ内のものを見れば、以下のようになっています。

InfoPlist.strings
/* Localized versions of Info.plist keys */ CFBundleDisplayName = "Bonjour Monde";

フランス語が優先されているシステムでは、「Bonjour Monde」と表示されることがわかります。

4 HelloWelt.html

それでは、主要 HTML ファイルを見てみます(空行は除去して詰めています)。

HelloWelt.html
<html> <head> <!-- スタイルシートは別のファイル内に格納されたほうがいい。これはウィジェットに対するデザインを収容。 ウィジェット内の各言語プロジェクトディクレクトリは独自のHelloWelt.cssファイルを持つことに注意 これは言語にもとづいて、ウィジェットの各ローカル化が異なるデザインを持つから Dashboard はユーザーの言語環境設定により自動的に正しい CSS ファイルをウィジェットに提供する --> <style type="text/css"> @import "HelloWelt.css"; </style> <!-- JavaScriptファイルは、ローカル化による修正と動作を含む、ウィジェットに必要な動作を収容 --> <script type='text/javascript' src='HelloWelt.js' charset='utf-8'/> <!-- localizedStrings.js ファイルは、ウィジェットの各言語プロジェクトディレクトリ内にある ここで開かれるバージョンは、システム環境設定で選ばれたユーザーの優先言語による --> <script type='text/javascript' src='localizedStrings.js' charset='utf-8'/> </head> <body onload="setup();"> <!-- setup() は本体テキストのローカル化を試みる --> <img src="Default.png"> <!-- ウィジェットの背景 --> <div id="helloText">Hello, World!</div> <!-- 「Hello, World!」テキストに対する場所確保テキスト --> <div id="language">Default</div> <!-- 英語における現在使われている言語 --> </body> </html>

スタイルシートは、コメントとは違って、このサンプルでは CSS は 1 つです。まず全体の JavaScript ファイルが読み込まれ、それからローカル化が読み込まれていることに注意してください。HTML では、スタイルシートでも、最初に読み込まれたものを後で読まれたものが上書きします。本体が読み込まれた後で、onload イベントハンドラに設定されている setup() が呼ばれます。その後で、要素が並んでいます。位置などは、CSS で設定されています。また、JavaScript で扱うために id 属性が設定されていることに注意してください。

5 HelloWelt.css

スタイルシートを見てみましょう。

HelloWelt.css
body { <!-- 本体全体の指定 --> margin: 0; } #helloText { <!-- ID が helloText であるもの --> font: 21px "Lucida Grande"; font-weight: bold; color: white; text-align: center; position: absolute; top: 44px; left: 10px; width: 200px; } #language { <!-- ID が language であるもの --> font: 11px "Lucida Grande"; color: white; text-align: center; position: absolute; top: 90px; left: 18px; width: 180px; }

指定は Hello World とほとんど変わらないので、内容はわかると思います。

先頭の「#」に気をつけてください。これは id 属性の値でスタイルを適用する先を指定するもので、ID セレクタと呼ばれます。「要素名#名前」のような形でも可能で、その要素で名前の id 属性をもつものを指定します。これとは別に「要素名.名前」だと、その要素で名間の class 属性をもつものを指定します。

セレクタにはさまざまな種類があり、基本的なものが要素名(body など)と「*」(すべての要素)になります。後者は、セレクタ指定のいろんな場所で使えます。たとえば、*.special だと、special というクラス名をもつすべての要素に適用されます。

属性を使った指定も可能で、要素名[属性名] の形だと、div[id]id 要素が指定された div 要素に適用します。要素名[属性名="属性値"] の形だと、div[id="helloText"]id 要素に "helloText" が指定された div 要素だけに適用します。[属性名~="属性値"] の形だと、空白で区切られたリスト内のどれかに一致すれば適用されます。div[class="special"]<div class="title special"><div class="list special"> のどちらにも適用されます。[属性名|="属性値"] の形だと、ハイフン区切りのリスト内の先頭に一致すれば適用されます。div[lang|="en"] で、en と en-US の両方の div に適用させられます。

この他にもフォーカス状態や言語コード、最初の子などを示す疑似クラスや、1行目や先頭1文字などを表す疑似要素などもあります。

また、セレクタは、コンマで区切ると、両方に対して同じ指定をできます。たとえば、h1, h2 で両要素に同じスタイル指定をできます。半角スペースで区切ると前のセレクタに含まれるものに適用できます。たとえば、table.fig td だと、fig クラスの table 要素内の td 要素を指します。また、> だと直接の子要素の場合だけに限定できます。+ で区切ると両方が同じ親要素を持ち、前のセレクタの直後に後のセレクタが現れた場合だけ適用されます。

こうしたものを使えば、もっと記述を共有化したり単純化できます。とはいえ、別に慣れないなら、繰り返しも有効でしょう。あまり単純化しすぎても、構造が複雑になり、あとで最終的にどういう指定がされるのかがわかりにくくなる場合もあります。

6 HelloWelt.js

それでは、ローカル化の前に読み込まれているJavaScriptファイルを見てみます。このファイル内では、getLocalizedString(key) という内部的に使われる関数と、本体の onload イベントハンドラである setup() の 2 つの関数が定義されています。

HelloWelt.js > getLocalizedString
// getLocalizedString() は、localizedStrings という配列から文字列を引き出す // ウィジェットの各言語プロジェクトディレクトリは「localizedStrings.js」というファイルをもつ // これは、localizedStrings という配列を含んでいる // このメソッドは、システム環境設定の言語環境ペインによって、 // 最高の優先度をもつ言語のファイルの配列に対して問い合わせを行う function getLocalizedString(key) { try {// エラー処理ブロック開始 var ret = localizedStrings[key]; // キーにより配列の値を取得 if (ret === undefined) // 取得できなければ ret = key;// キーそのものを値にする return ret; } catch (ex) {} // エラー処理 return key; }

localizedStrings という名前の配列から値をとりだしています。この配列は、各言語プロジェクトディレクトリ内の localizedStrings.js ファイル内で定義されています。それを見てみましょう。

ja.lproj > localizedStrings.js
var localizedStrings = new Array; // 配列インスタンス作成 localizedStrings['Hello, World!'] = 'こんにちは、世界!'; // 配列値追加 localizedStrings['Default'] = 'Japanese'; // 配列値追加

このように、キー 'Hello, World!' とキー 'Default' に対する値をもつ、localizedStrings という配列が作られています。上の関数は、この配列から値を取り出していたわけです。

onload イベントハンドラから呼び出される関数を見てみましょう。

HelloWelt.js > setup
// setup() は、本体が読み込まれた時に呼び出される // この関数はウィジェット内にローカル化文字列を配置する function setup() { document.getElementById('helloText').innerText = getLocalizedString('Hello, World!'); document.getElementById('language').innerText = getLocalizedString('Default'); }

document オブジェクトは、HTML ファイルやそこに記述されるドキュメントの内容を提供するものです。これは最上位の window オブジェクトのプロパティですが、省略可能なので、省略されています。getElementById メソッドは指定された id をもつ要素を返します。最後の innerText は、タグ要素オブジェクトの内容テキストです。これに HTML タグが入ったものを入れても、そのまま表示されます。タグを解釈して内容を表示してほしい場合は、innerHTML を使います(ただし、ここれは W3C DOM 仕様の一部ではないので注意が必要です)。ウィジェットには関係ありませんが、この innerText は FireFox では動作せず、かわりに textContent を使います。ここでは、これに配列から取得したテキストを代入しているだけです。

7 まとめ

このようにウィジェットのローカル化は簡単です。ただ、このサンプルではそのままですが、ローカル化によって文字列長に非常に違いがあったりなどの場合、もっと複雑な動作を実装する必要があるかもしれません。たとえば、日本語の場合は縦書きで表示する、という場合は、CSS が必要になり、また JavaScript で調整をする必要があるでしょう。


管理人:神吉 秀典 E-mail:puer@ba.wakwak.com