Python - MenuMaker 日本語化 - 出力後に日本語化

クラウディア 
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」のメニューは、カテゴリを日本語化できます。
earthcar(アースカー)