Top > Extensions > Localization *ローカライズ [#lfc18ab9] 拡張機能のローカライズ関連について取り上げます。テンプレートパッケージやギャラリーは各ページでローカライズ方法に関する記載があります。 ここでは主に Basic などのコードやダイアログなどを利用した拡張機能の多言語化についてです。 #contents **Addons.xcu [#xcf39ff0] 得にメニューやツールバーへの統合目的の Addons.xcu の設定では多言語を利用できます。 多言語にする必要があるのはメニューやツールバーボタンの Title です。元から多言語が利用できるようになっているため、言語ごとに xml:lang に言語を設定してやります。 <prop oor:name="Title" oor:type="xs:string"> <value xml:lang="en-US">~English</value> <value xml:lang="ja">~日本語</value> </prop> ***ツールバー名 [#p75bf574] Addons.xcu ファイルで追加したツールバー名のローカライズは [[Addons>Extensions/Addons]] 参照。 **文字列 [#f17a7483] 文字列はコード中に埋め込まれるとローカライズできなくなってしまいます。そこで、OOo のコンフィグレーションファイルを利用した方法がよく使われます。com.sun.star.resource.StringResourceWithLocation サービスを利用する方法もあります。以下別項目参照。 コンフィグレーションは /share/registry 以下で見られる xml ファイルです。構造を指定するスキーマ xcs ファイルを書くのは結構面倒です。 多くの場合簡単な文字列 (メニューや警告文など) なので既存のスキーマをテンプレートとして利用すれば容易に自分の拡張機能の文字列用コンフィグレーションファイルが作成できます。 利用するのは OOo のメニューなどの文字列を保存してある /org.openoffice.Office.UI 以下にある XXXCommands.xcs ファイルで使われているものです。 スキーマファイル xcs はこんな感じにします。oor:package="mytools.basicide" および oor:name="IACommands" の部分は拡張機能 ID などに変更します。 #code(xcu){{ <?xml version="1.0"?> <oor:component-schema xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" oor:name="IACommands" oor:package="mytools.basicide" xml:lang="en-US"> <import oor:component="org.openoffice.Office.UI.Commands"/> <uses oor:component="org.openoffice.Office.UI.Commands"/> <templates/> <component> <group oor:name="UserInterface"> <set oor:name="Commands" oor:node-type="LabelType" oor:component="org.openoffice.Office.UI.Commands"> </set> </group> </component> </oor:component-schema> }} これに対応した実際のデータ xcu ファイルは次のようになります。oor:name="IACommands" および oor:package="mytools.basicide" の部分は上記 xcs ファイルと同じものにしておきます。 #code(xcu){{ <?xml version='1.0' encoding='UTF-8'?> <oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="IACommands" oor:package="mytools.basicide"> <node oor:name="UserInterface"> <node oor:name="Commands"> <node oor:name="mytools.basicide:Insert.Date" oor:op="replace"> <prop oor:name="Label"> <value xml:lang="en">~Date</value> <value xml:lang="ja">日付(~D)</value> </prop> </node> <node oor:name="mytools.basicide:Insert.Time" oor:op="replace"> <prop oor:name="Label"> <value xml:lang="en">~Time</value> <value xml:lang="ja">時間(~T)</value> </prop> </node> </node> </node> </oor:component-data> }} Commands ノード内に name 属性を個別に指定した子ノードを作成します。この子ノードは Label プロパティに言語ごとの値を保持できます。 これらの値をコード内で利用するために取得するのは com.sun.star.configuration.ConfigurationAccess サービスを利用します。 **ダイアログ [#z4ada51e] ダイアログのローカライズは OOo 2.2 から利用できるようになりました。 ダイアログエディタで表示メニューから言語ツールバーを表示、新しい言語を追加します。 あとは言語を切り替えて各言語に対応したラベルなどを入力します。 ダイアログは OOo のロケールに対応した言語で表示されます。(OOo 2.3 ではバグがあり言語が正しく選択されませんでした。最新版では修正済。) ダイアログに言語を追加した後で注意が必要です。 空のテキストボックスを配置してあるダイアログでは、表示時には何も表示されていませんがコントロールのコントローラから getText メソッドで文字列を取得するとリソース ID が取得されることがあります。テキストボックスの入力チェックなどを行うような場合にはダイアログ表示前に空文字列で初期化しておくべきです。 **ヘルプ [#m71ef34c] 言語ごとのファイルを言語名のディレクトリに入れておきます。[[Help>Extensions/Help#i7f139f7]] ヘルプは言語のものが見つからない時には en が利用されることになっています。en は用意しておけとの…。 **リソース [#m3ea85f0] OpenOffice.org の UI で利用されている文字列は多くの場合 /program/resource 以下にリソースファイルとして保存されています。これはロケールごとに分けられており、/singletons/com.sun.star.resource.OfficeResourceLoader を利用して読み込むことができます。ロケールを指定しなくても現在のロケール設定に対応したものが読み込まれます。 (com.sun.star.resource.VclStringResourceLoader は利用せずに上記を利用しましょう。OOo Basic からは動作しますが、Py-UNO からは Vcl の方はうまくいきません。) とはいえ、リソース文字列を取得する際のリソース ID がバージョンによって変化する可能性が挙げられています。&idlref(com.sun.star.resource.OfficeResourceLoader); ***リソース ID の調べ方 [#qec3a09c] バイナリエディタで調べる以外の方法が思いついたら書きます。 **メニューコマンド [#g27f92bd] メニューの項目はメニューのコマンド URL に対して各言語の文字列がコンフィグレーションに保存されています。モジュールによりファイルが異なります。 /org.openoffice.Office.UI.XXXCommands 以下にあります。 OOo のインストールディレクトリの shared/registry/res/LANG/org/openoffice/Office/UI 以下に相当します。 **その他 [#v1103b75] その他、ライセンス表示、拡張機能マネージャでの表示名、更新時のパブリッシャー表示、ツールチップなどは description.xml ファイルでローカライズする方法が提供されています。[[description.xml>Extensions/description]] **現在の言語を調べる [#vd1eea56] コンフィグレーション中に現在の言語を保持している項目があり、起動時に書き換えられます。 /org.openoffice.Setup/L10N の ooLocale プロパティを参照してください。ロケールを文字列として取得できます。 **ツールチップと拡張ヘルプ [#i47ba946] ヒントや詳細ヒント。 ダイアログのヒントはヘルプテキストに入力したものが言語に応じて表示されます。 一方、Shift + F1 キーを押したときの詳細ヒントは拡張機能ヘルプに記載します。これは言語に対応したものが利用されます。OOo Basic のマクロでもヘルプの hid にマクロを実行する URL を入力することで利用できます。 **StringResourceWithLocation (文字列2)[#x59832a2] StringResourceWithLocation サービスを利用する。これは、他言語設定をしたダイアログで作成されるリソースファイルを使って文字列を取得する方法です。上記の文字列を xcu ファイルに入れておく方法の代わりに利用しようというもの。[[紹介元 extension ML 参照。>http://extensions.openoffice.org/servlets/ReadMsg?list=dev&msgNo=1334]] [[関連>http://wiki.services.openoffice.org/wiki/Extensions/website/Minutes/2008-04/2008-04-24-IRCLogs]] この方法では拡張機能 ID が必要です。 [[BookmarksMenu>OOobbs2/83]] 拡張機能で試してみます。この拡張機能は Basic ライブラリに統合されたダイアログを七つ持っており、英語、日本語、フランス語の三ヶ国語および文字列リソースは 200 ほどあるようです。拡張機能 ID は mytools.BookmarksMenu です。 そして、パッケージ内の mytools_BookmarksMenu ディレクトリに次のような文字列リソースがあります。DialogStrings の部分の名称を利用します。 -DialogStrings_en_US.default -DialogStrings_en_US.properties -DialogStrings_fr.properties -DialogStrings_ja_JP.properties まず、[[PackageInformationProvider>OOoBasic/Generic/Extensions]] を利用して ID から拡張機能パッケージがインストールされているディレクトリを取得します。 StringResourceWithLocation サービスをインスタンス化して利用しますが、OOo Basic からコンストラクタは利用できないので、代わりに initialize メソッドで初期化します。与える引数はコンストラクタ create に与える引数と同じ順番、同じ数で一つの配列として与えます。[[IDL Ref. StringResourceWithLocation>http://api.openoffice.org/docs/common/ref/com/sun/star/resource/StringResourceWithLocation.html]] initialize に与える配列の引数はそれぞれ次のものです。 -リソースファイルのあるディレクトリ URL -読み込み専用で開くかどうか -ロケール -リソースファイル名。言語、国名を省いた部分で指定。 -ハンドラ。不要なので Null 文字列の ID を調べてきて、resolveString メソッドで ID を指定して取得します。 #code(ob){{ sub StrResourceLocation_1 oContext = GetDefaultContext() sPkgId = "mytools.BookmarksMenu" sPIPName = "/singletons/com.sun.star.deployment.PackageInformationProvider" '2.3 If oContext.hasByName( sPIPName ) Then ' 2.3 oPkgIP = oContext.getByName( sPIPName ) ' パッケージのディレクトリ名を取得 sPkgLocation = oPkgIP.getPackageLocation( sPkgId ) ' DialogStrings ファイルのあるディレクトリ名 sDlgLocation = sPkgLocation & "/mytools_BookmarksMenu/" ' サービスをインスタンス化して初期化します oStrRes = CreateUnoService( _ "com.sun.star.resource.StringResourceWithLocation") oStrRes.initialize( Array( _ sDlgLocation, True, _ CreateLocale("ja","JP"), "DialogStrings", "", Null ) ) msgbox oStrRes.resolveString( "1.Dialog1.Title" ) 'mri oStrRes End If end sub Function CreateLocale( sLang As String, sCountry As String ) aLocLocale = CreateUnoStruct("com.sun.star.lang.Locale") aLocLocale.Language = sLang aLocLocale.Country = sCountry CreateLocale = aLocLocale End Function }} リソースファイル内では文字列は次のような形式で保存されています。 ID=MOJIRETSU また、リソースファイル内ではマルチバイト文字は \uXXXX の形になっています。 Py-UNO から StringResourceWithLocation サービスを利用するときは次のようにします。 initialize するときに最後の引数に None を与えると失敗するのでダミーで XInteractionHandler インターフェースを与えます。 #code(python){{ from com.sun.star.task import XInteractionHandler class dummy_handler(unohelper.Base,XInteractionHandler): """ dummy XInteractionHanlder interface for the StringResouceWithLocation """ def __init__(self): pass def handle(self,request): pass # ... # ... str_res = ctx.ServiceManager.createInstanceWithContext( "com.sun.star.resource.StringResourceWithLocation", ctx ) str_res.initialize( (resource_url,True,locale,"ClipboardManager","",dummy_handler() ) ) }} **文字列3 [#tf1972d3] ダイアログのリソースファイルを利用すると不要なものも混じってきます。ダイアログはダイアログで用意するとして、別に xcu ファイルを利用せずに上記のリソースファイルを利用するとしてもマルチバイト文字列のエスケープの問題でメンテナンスが面倒です。 というわけでマクロを書いてみました。表計算ドキュメント上に ID とリソース文字列を記述しておき、上記の StringResourceWithLocation サービスを利用してリソースファイルを生成するもの。 -A1: コメント -A2: リソースファイル名の接頭語 -A3: デフォルトロケール -列A: リソース ID -行4: ロケール文字列 -列B 以降: 言語に対応したリソース文字列 ドキュメント中の Standard - Module1 - Main を実行するとドキュメントと同じディレクトリにリソースファイルが作成されます。 また、言語と ID の増減は自動で検出します (セルカーソルの used area)。 既存のダイアログなどのリソースファイルを読み込めるようにしたもの。 +A2: 接頭名、A3: デフォルトロケールを入力 +Module2 の ImportMain を実行 するとシートに ID とロケールごとの文字列を読み込みます。 コメントは読み込み不可 (書き込みのみ) なので読み込まれません。ダイアログの文字列の訳を作るときなどに。 行の移動などがやりにくかったので、A2: 接頭名、A3: デフォルトロケールに変更したもの。 &ref(StrResource_03.ods); ダイアログエディタに慣れていない人でも翻訳操作が比較的容易です。 |