ページ

2010年1月9日土曜日

BlogAssistant(5) - プラグインのローカライズ文字列事情

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)Cocoaの日々: BlogAssistant(4) - プラグインのプロトタイプ作成

前回 Safariのコンテキストメニューへメニューを追加した。


次はここを足がかりにして処理を加えていく。その最初の一歩としてメニュー文字列を testではなくきちんとした文言に変えよう。また後々を考えてローカライズしておこう。

まずは(いつものごとく) Localizable.strings を作る。


中身はこんな感じ。最初のうちは英語だけ作っていく。


これを NSLocalizedString( ) で参照する。


item = [[[NSMenuItem alloc] initWithTitle:
  NSLocalizedString(@"MenuAddPage", @"")
   action:@selector(addPage:)
keyEquivalent:@""] autorelease];


実行して確認してみる。


ちょっと違う。

うっかりしていたが NSLocalizedString( ) はメインバンドル内の Localizable.strings を参照するようになっている。プラグインは Safari のコンテキストで動作するので、メインバンドルはこのプラグインのそれではなく Safari のバンドルが使われる。プラグインのバンドル(NSBundle)を明示的に指定してやる必要がある。

同系列の関数には NSLocalizedStringFromTableInBundle( ) があって、こちらだとバンドルを指定することができる。

バンドル(NSBundle)を取得するにはいくつか方法がある。

Mac Dev Center: NSBundle Class Reference



今回は +[bundleForClass:] を使うことにする。また NSLocalizedString( ) のリファレンスによれば、内部的には -[NSBundle localizedStringForKey:value:table:] を呼び出しているとのことだったので、これを使うことにする。

Mac Dev Center: NSBundle Class Reference - localizedStringForKey:value:table:

マクロではなくユーティリティクラスを用意して、そこへメソッドとして実装する。

Utility.m

@implementation Utility

+ (NSString*)localizedStringForKey:(NSString*)key
{
NSBundle* bundle = [NSBundle bundleForClass:[self class]];
return [bundle localizedStringForKey:key value:@"" table:nil];
}

@end


これを使う様に修正を入れ、

item = [[[NSMenuItem alloc] initWithTitle:
  [Utility localizedStringForKey:@"MenuAddPage"]
   action:@selector(addPage:)
keyEquivalent:@""] autorelease];


実行してみよう。

出た。
これで行こう。