ホームページ>開発ツール>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は英字のままでも構わない、という特性に由来するものです。
実装方法
実装にあたっては、以下の点に留意します。
両者は一見すると矛盾して見えますが、これを解決するのが、.appバンドル(パッケージ)です。
- ヘルプ名を日本語化したいアプリケーション(以下、本来のアプリ)とは別に、(本来のアプリを)書き換えるための(一種の)プリプロセッサを用意すること。
- 利用者がこの書き換え処理を意識しないこと。すなわち、通常のアプリを扱うこと以上の操作を要求しないこと。
バンドルの実体はフォルダなので、内部に別のアプリケーションを含めることが可能です。(この辺は、Xcode 4等が参考になります。)
なので、バンドル内に本来のアプリを置き、バンドルの実行ファイルがプリプロセッサとして、書き換え後に起動も行うようにしておけば、利用者は単体のアプリと同等に扱うことができます。
なお、バンドルの実行ファイルはCocoaやCarbonである必要はなく、シェルスクリプトやアップルスクリプトでも構わないので、今回はシェルスクリプトを用います。
バンドル構成
バンドルの構成は、以下の通りです。
バンドルの名前/アイコン/(後述するInfo.plistの)バージョン情報を本来のアプリと一致させておくと、外観上は区別がつかなくなります。+-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は、例えば以下のように記述します。
(正式には、ガイドラインに示されたキーは全て含めた方がいいとは思います。)
注)バージョン情報は本来のアプリと同一にしておく。<?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]