ホームページ開発ツール>Xojo / Real Studio Trial and Error・標準のヘルプビューアを利用する・日本語対策編

 Xojo / Real Studio Trial and Error

標準のヘルプビューアを利用する・日本語対策編

目次
 はじめに

 標準のヘルプビューアを利用する話題の続きです。
 OSのバージョンに関わらず、ヘルプ名(タイトル)を日本語で表示するための対応策(案)を試行してみます。
注)本記事の内容は、実はReal Studioとはほぼ無関係なのですが、話題の流れ上、ここに置いています。

 基本方針

 今回試す方法は「10.6のみ、ヘルプ名を日本語に置き換えない」というものです。

 具体的には「OSのバージョンを取得して、10.6ならCFBundleHelpBookNameの日本語名を収めたInfoPlist.stringsファイルの名前を無効なもの(例えば、_InfoPlist.strings)に書き換え」ます。

 これは、10.5ではAppleTitileとCFBundleHelpBookNameの一致(いずれも日本語でなければならない)が必須だが、10.6(以降)ではAppleTitileは任意でCFBundleHelpBookNameは英字のままでも構わない、という特性に由来するものです。


 実装方法

 実装にあたっては、以下の点に留意します。
  1. ヘルプ名を日本語化したいアプリケーション(以下、本来のアプリ)とは別に、(本来のアプリを)書き換えるための(一種の)プリプロセッサを用意すること。
  2. 利用者がこの書き換え処理を意識しないこと。すなわち、通常のアプリを扱うこと以上の操作を要求しないこと。
 両者は一見すると矛盾して見えますが、これを解決するのが、.appバンドル(パッケージ)です。

 バンドルの実体はフォルダなので、内部に別のアプリケーションを含めることが可能です。(この辺は、Xcode 4等が参考になります。)
 なので、バンドル内に本来のアプリを置き、バンドルの実行ファイルがプリプロセッサとして、書き換え後に起動も行うようにしておけば、利用者は単体のアプリと同等に扱うことができます。

 なお、バンドルの実行ファイルはCocoaやCarbonである必要はなく、シェルスクリプトやアップルスクリプトでも構わないので、今回はシェルスクリプトを用います。


 バンドル構成

 バンドルの構成は、以下の通りです。
+-My Application.app               // Application(本来のアプリと同じ名前にしておく)
    +- Contents                    // Folder
        +- Info.plist              // プロパティリスト
        +- MacOS                   // Folder
            +- script.sh           // バンドルの実行ファイル(プリプロセス用シェルスクリプト)
        +- Resources               // Folder
            +- myApp.icns          // アイコン(本来のアプリと同じアイコンにしておく)
        +- Application             // Folder
            +- My Application.app  // 本来のアプリ
 バンドルの名前/アイコン/(後述するInfo.plistの)バージョン情報を本来のアプリと一致させておくと、外観上は区別がつかなくなります。


 Info.plist

 Info.plistは、例えば以下のように記述します。
(正式には、ガイドラインに示されたキーは全て含めた方がいいとは思います。)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleExecutable</key>
	<string>script.sh</string>
	<key>CFBundleIconFile</key>
	<string>myApp.icns</string>
	<key>CFBundleGetInfoString</key>
	<string>1.0.0 (c)2013 My Company</string>
</dict>
</plist>
 注)バージョン情報は本来のアプリと同一にしておく。


 script.sh

 バンドルの実行ファイルであるscript.shは、例えば以下のように記述します。(作成後は実行権限を付与しておきます。)
#!/bin/sh

# アプリケーションの名前
APPNAME="My Application"

# OSのマイナーバージョンを取得
SVER0=`sw_vers -productVersion`
SVER1=`echo "$SVER0" | sed -e "s/^\([^.]*\).\(.*\)$/\2/"`
SVER2=`echo "$SVER1" | sed -e "s/^\([^.]*\).\(.*\)$/\1/"`

# パス中のスペースを区切りとしない設定をした後、自身の場所に移動
IFS_BACKUP=$IFS
IFS=$'\n'
SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR

# OSのバージョンが10.6ならタイトルの日本語化を無効にし、それ以外なら有効にする
if [ "$SVER2" = "6" ]; then
	mv "../Application/${APPNAME}.app/Contents/Resources/Japanese.lproj/InfoPlist.strings" \
	"../Application/${APPNAME}.app/Contents/Resources/Japanese.lproj/_InfoPlist.strings"
else
	mv "../Application/${APPNAME}.app/Contents/Resources/Japanese.lproj/_InfoPlist.strings" \
	"../Application/${APPNAME}.app/Contents/Resources/Japanese.lproj/InfoPlist.strings"
fi

# 本来のアプリを起動
open "../Application/${APPNAME}.app"

# パス中のスペースを区切りとしない設定を元に戻す(不要かも)
IFS=$IFS_BACKUP

exit 0
 注)条件によってはリネームに失敗するが、実害はない(と思う)ので特に何もしていない。(必要なら対策して下さい。)


 結果

 実行してみましたが、とりあえず、所期の目的は達成できています。
 副作用が起きないか等、詳細はもう少し動かして、様子を見た方がいいかもしれません。

 なお、アプリは2回起動されることになるのですが、Dock上の動作は、10.5/7/8では通常のアプリと見分けがつきません。
 一方10.6は、アプリが入れ替わるのがよく分かります(キャッシュが効くと多少は緩和されますが…)。やはり10.6は他のバージョンとはちょっと違う?

 あと、Codesignですが、バンドル全体に対して一回行えば(つまり、本来のアプリに別途施さなくても)よさそうです。


 お世話になったサイト

 貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)

 参考サイト(1):EZ-NET: 文字列から特定の文字を抽出する - Linux シェルスクリプト プログラミング
 参考サイト(2):逆引きシェルスクリプト/スペースが含まれる文字列を1行として扱う方法 - Linuxと過ごす
 参考サイト(3):shスクリプト内で安全に相対パスを使う
 参考サイト(4):if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス


 更新履歴

 2013.03.20 新規作成


[Home]  [MacSoft]  [Donation]  [History]  [Privacy Policy]  [Affiliate Policy]