NSRuleEditorのローカライズ(その1)
数日の間、アップルのサンプルPredicateEditorSampleをベースにNSRredicateEditorに取り組んでいます。複雑なインタフェースを簡単に実装できるのはありがたいのですがローカライズには問題があります。まず、単純なローカライズですがLocalizable.stringでははうまく変換されません。Cocoabuilder/Getting localized NSPredicateEditorによれば、NSPredicateEditorではローカライズファイルを明示する必要があるようで、暗黙にLocaizable.stringを参照してはくれないみたいです。メインバンドルに任意のstringファイルを作成して
[predicateEditor setFormattingStringsFilename:@"predicate.strings"];として教えてあげる必要があります。また、ポップアップにあたる部分の書式は"%[xxxx]@"というように書きます。
"%[All]@ of the following are true" = "%[すべて]@ すべての条件が一致したら";
"%[Any]@ of the following are true" = "%[いずれか]@ いずれかの条件が一致したら";
"%[price]@ %[is less than]@ %[1000]@" = "%[値段]@ %[より安い]@ %[1000円]@";
"%[price]@ %[is less than]@ %[1500]@" = "%[値段]@ %[より安い]@ %[1500円]@";これでなんとか「less than」なんかとオサラバできるわけですが、問題はここから。ローカライズは単純な置換だけなので文法の変更まではしてくれません。数式としてならprice<1000も違和感ないのですが、日本語としては、”値段 より安い 1000円"というように述語が真ん中にくるのはいただけない。

で、ここをなんとか"値段 1000円 より安い”にしたいわけです。NSPredicateEditorRowTemplateのドキュメントには、
You can subclass NSPredicateEditorRowTemplatetocreatearowtemplatewithdifferentnumbersortypesofviews.
とあるのですが、左辺・述部・右辺の順までには触れていません。Editorは、最終的にはユーザの指定した条件式を表すNSPredicateクラスのオブジェクトを生成する必要があるわけですが、そのための処理を左辺・述部・右辺の順が固定化されたNSPredicateEditorRowtemplateをベースに行っているらしくそれをカスタマイズするメソッドを見あたりませんでした。英語圏の人にはこれで十分でしょうが、ちょっとぼくら日本人には...
で結論は、そーゆー方々は「NSRuleEditorを直接使え」ってことで開発をNSRuleEditorベースに軌道修正しました。ベースにしたのは、googleのサンプル。このサンプルも述部が真ん中に来る(英語圏の人が作ったサンプルなので仕方がない)のは同じですが、NSPredicateEditorとは違いdelegeteメソッドを駆使してテンプレートを使うよりは細かい制御ができる仕組みになっていて、NSPredicateの生成のための情報をruleEditor:predicatePartsForCriterion:withDisplayValue:inRowのdelegeteメソッドで返しているようで期待が持てます。果たして.... 結果は次回(その2)で書きます。






Comments