- 1. 概要
- 2. ToJapanese.py
- 3. CLI.py
1. 概要
極力、元のソースには手を付けたくなかったのですが・・・。
毎回、2回動かすのも、面倒・・・。
とうとう、手を付けてしまいました。
前ページでは、「Fluxbox」が対象でしたが、今回は、「Openbox」を対象としています。
まだ、デスクトップをまとめて処理しきれていないのだ・・・。
2. ToJapanese.py
日本語化モジュールを
/usr/local/share/menumaker/MenuMaker/ToJapanese.py
として作成します。
label_dict = {
"Configure" : "設定",
"Development" : "開発",
"Editors" : "エディタ",
"Exit" : "終了",
"Graphics" : "グラフィックス",
"Multimedia" : "マルチメディア",
"Network" : "ネットワーク",
"Office" : "オフィス",
"Reconfig" : "再設定",
"Restart" : "再起動",
"Settings" : "設定",
"Shells" : "シェル",
"Styles" : "スタイル",
"System" : "システム",
"Utilities" : "ユーティリティ",
"Workspaces" : "ワークスペース",
}
def convert(a):
for i in range(0, len(a)-1):
for key, value in label_dict.items():
a[i] = a[i].replace("label=\""+key+"\"", "label=\""+value+"\"")
a.insert(-2, ' <separator/>')
a.insert(-2, ' <menu id="50" label="終了">')
a.insert(-2, ' <item label="ログアウト"> <action name="Exit"/> </item>')
a.insert(-2, ' <item label="再起動"> <action name="Execute">')
a.insert(-2, ' <execute>sudo /sbin/reboot</execute>')
a.insert(-2, ' </action> </item>')
a.insert(-2, ' <item label="シャットダウン"> <action name="Execute">')
a.insert(-2, ' <execute>sudo /sbin/poweroff</execute>')
a.insert(-2, ' </action> </item>')
a.insert(-2, ' </menu>')
1~18行は、英語のキーワードを日本語化するための、連想配列(「Python」では、「dict」と呼ぶらしいが、これって連想配列でしょ?)。
22~24行は、英語のメニューの中から「label="英語キーワード"」を検索して「label="日本語"」に変換しています。
「label=」をつけないと、実行モジュール名を日本語にしてしまうのだ。
26~35行は、末尾に、「ログアウト」「再起動」「シャットダウン」のメニューを加えています。
3. CLI.py
/usr/local/share/menumaker/MenuMaker/CLI.py
に、前項のモジュールを組み込みます。
実は、もう一点、わたしには、マージ処理で気に食わないところがあるので、マージ処理をスキップする処理を加えています。
import Prophet
from Keywords import Keyword as Kw, Set as KwS
前項の「ToJapanese.py」を「import」します。
import Prophet
from MenuMaker import ToJapanese
from Keywords import Keyword as Kw, Set as KwS
noDebian = False # Exclude Debian apps database
vStr = "be verbose"
マージスキップ、日本語化のオプション有無を示す、「bool」型の変数「noMerge」「toJapanese」を定義して「false」で初期化します。
noDebian = False # Exclude Debian apps database
noMerge = False # Exclude Merge proccess
toJapanese = False # Localizing into Japanese
vStr = "be verbose"
class OP(_OP):
の前に、「マージ」「日本語化」オプションがつけられていたら、オプションを有効にする関数を追加します。
nmStr = "skip merging"
def nmOpt(option, opt, value, parser):
global noMerge
noMerge = True
tjStr = "Localizing into Japanese"
def tjOpt(option, opt, value, parser):
global toJapanese
toJapanese = True
class OP(_OP):
op.add_option("-s", "--skip", metavar="list", nargs=1,
type="string", action="callback", callback=sOpt, help=sStr)
opts, args = op.parse_args()
「マージスキップ」「日本語化」のオプションをそれぞれ、「--no-merge」「--to-japanese」として定義し、有効化する関数を組み込みます。
op.add_option("-s", "--skip", metavar="list", nargs=1,
type="string", action="callback", callback=sOpt, help=sStr)
op.add_option("--no-merge", action="callback", callback=nmOpt, help=nmStr)
op.add_option("--to-japanese", action="callback", callback=tjOpt, help=tjStr)
opts, args = op.parse_args()
これを書くだけで、ヘルプにも表示されます。
この点、良く出来ているなぁ。
merged = Prophet.merge(legacy + desktop + debian)
マージする処理を、「--no-merge」のオプションを指定したら、スキップしています。
if noMerge:
msg(" skipping Merge")
merged = legacy + desktop + debian
else:
merged = Prophet.merge(legacy + desktop + debian)
for x in menu.emit(0):
file.write(x)
file.write("\n")
最後にメニューを出力する処理です。
「日本語化オプション」が有効であれば、日本語化したうえで、メニューファイルを出力します。
if toJapanese:
a = list()
for x in menu.emit(0):
a.append(x)
ToJapanese.convert(a)
for x in a:
file.write(x)
file.write("\n")
else:
for x in menu.emit(0):
file.write(x)
file.write("\n")
これで、一応、「Openbox」の「FreeBSD」のメニューは、カテゴリを日本語化できます。
|